代码之家  ›  专栏  ›  技术社区  ›  Léa Gris

如何根据区域设置环境变量设置浮点显示格式?

  •  1
  • Léa Gris  · 技术社区  · 6 年前

    假设我有几个浮点数要在bash脚本中打印。 但我希望浮点数与 LC_NUMERIC 语言环境变量。

    #!/usr/bin/env bash
    
    # For consistent/reproducible error messages in this sample code
    LANGUAGE=C
    
    # The speed of light in vacum in m.s
    declare -r const_C=299792458
    
    # Declare separately when assigning command output
    declare -- const_pi
    
    # π is 4 × arc-tangent of 1, using bc calculator with math library
    typeset -r const_pi="$(bc --mathlib <<<'scale=20; 4*a(1)')"
    
    # Do it in US's English
    LC_NUMERIC=en_US.utf8
    printf 'LC_NUMERIC=%s\n' "${LC_NUMERIC}"
    printf 'Speed of light in vacuum is:\nC=%.f m/s\n\nπ=%.10f\n' \
      "${const_C}" \
      "${const_pi}"
    
    echo $'\n'
    
    # Do it in France's French
    # it fails because floating point format
    # changes for printf parameters
    LC_NUMERIC=fr_FR.utf8
    printf 'LC_NUMERIC=%s\n' "${LC_NUMERIC}"
    printf 'La vitesse de la lumière dans le vide est :\nC=%.f m/s\n\nπ≈%.10f\n' \
      "${const_C}" \
      "${const_pi}"
    

    实际产量:

    LC_NUMERIC=en_US.utf8
    Speed of light in vacuum is:
    C=299792458 m/s
    
    π=3.1415926536
    
    
    LC_NUMERIC=fr_FR.utf8
    La vitesse de la lumière dans le vide est :
    C=299792458 m/s
    
    a.sh: line 29: printf: 3.14159265358979323844: invalid number
    π≈3,0000000000
    

    这是一个完美的预期结果,因为 printf %f 格式要求参数的格式根据 LC U数字 .

    那么如何显示存储在posix或 bc 的格式,但显示的内容反映了 LC U数字 是吗?

    如果我想要法文部分的代码,有以下输出呢?

    法语的预期产出:

    La vitesse de la lumière dans le vide est :
    C=299792458 m/s
    
    π≈3,1415926536
    
    0 回复  |  直到 6 年前
        1
  •  5
  •   n. m. could be an AI    6 年前

    这是bash自己的内置printf命令的问题。独立的printf可以正常工作。

    LC_NUMERIC=fr_FR.UTF8     printf 'Bad  : %f\n' 3.14
    env LC_NUMERIC=fr_FR.UTF8 printf 'Good : %f\n' 3.14
    

    输出

    script.sh: line 4: printf: 3.14: invalid number
    Bad  : 0,000000
    Good : 3,140000
    
    推荐文章