【问题标题】:Convert a string to a float with support for different locales (English and French)?将字符串转换为支持不同语言环境(英语和法语)的浮点数?
【发布时间】:2013-01-03 13:39:21
【问题描述】:

假设我用两种不同的符号表示这些相似的数字,英语和法语

1,200.25 = 英语

1 200,25 = 法语

是否有一个 PHP 函数可以接受这两个数字中的任何一个并将它们转换为浮点数?

1200.25 = 浮动

【问题讨论】:

  • 有什么方法可以知道输入与哪个语言环境相关联?
  • 只能使用if ($french) { doFrenchConversion() } else { doEnglishOrInvariantConversion() }吗?语言环境相当棘手(即使在一个语言环境中也可能存在很大差异)。

标签: php localization number-formatting


【解决方案1】:

你可以这样使用:

$replacements = array("1,200.25","1 200,25");
foreach($replacements AS $replaceText):
    $replace = preg_replace("#^(.*)(?:\.|\,)([0-9]{1,})$#","$1.$2",$replaceText);
    $replaceChars = array("# #","#,#");
    $text = preg_replace($replaceChars, "", $replace);
    echo $replaceText. " got replaced by: ".$text."<br />";
endforeach;

【讨论】:

    【解决方案2】:

    检查此代码:

    <?php
    
    function parse_float_locale($float_string, $locale) {
        $locale_info = array();
        switch ($locale) {
            case 'fr':
                $locale_info['thousands_sep'] = ' ';
                $locale_info['decimal_point'] = ',';
                break;
            case 'en':
            default:
                $locale_info['thousands_sep'] = ',';
                $locale_info['decimal_point'] = '.';
        }
    
        $float_string = str_replace($locale_info['thousands_sep'], '', $float_string);
        $float_string = str_replace($locale_info['decimal_point'], '.', $float_string);
    
        return floatval($float_string);
    }
    
    $str_en = '1,200.25';
    $str_fr = '1 200,25';
    
    $number_en = parse_float_locale($str_en, 'en');
    $number_fr = parse_float_locale($str_fr, 'fr');
    
    echo "Value en: $number_en";
    echo "Value fr: $number_fr";
    

    这将打印:

    值 en:1200.25

    值fr:1200.25

    【讨论】:

    • 你只说“小数点”,因为在你习惯的英文符号中,小数分隔确实是一个点。因此,这里使用的这种命名法具有误导性,将一个视为分隔标记,将另一个视为“应该是点”。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多