Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境

2024-03-17

在使用“hi_IN”进行数字验证时,我面临以下问题。

其中 Zend_Locale_Format::isFloat 对于非单个数字和任何语言环境都可以正常工作

但不适用于单位数字和区域设置“hi_IN”

源代码:(测试用例)

foreach (array('en_GB','en_US', 'lo_LA', 'hi_IN') as $locale) {

    foreach (array('12', '1') as $value) {

        if (!Zend_Locale_Format::isFloat($value, array('locale' => $locale))) {
            echo $value .' ==> '. $locale .' TRUE <br>';
        } else {
            echo $value .' ==> '. $locale .' FALSE<br>';
        }
    }
}

上述脚本的输出

12 ==> en_GB  FALSE
1 ==> en_GB   FALSE
12 ==> en_US  FALSE
1 ==> en_US   FALSE
12 ==> lo_LA  FALSE
1 ==> lo_LA   FALSE
12 ==> hi_IN  FALSE
1 ==> hi_IN   TRUE 

所以问题是我该如何解决 hi_IN 的这个问题。

提前致谢。


decimal 的管理模式存在错误。
但(据我所知)ZF1 已不再维护。

经过多次测试,我可以提出两种解决方案:

  • 第一个是添加一个'0'在你的号码之前。 (代替'1' by '01').

  • 第二个是修改Zend/Local/Format.php file.
    在私有静态函数中_getRegexForType代替 :

        if (strpos($pattern, ',') !== false) {
            $parts = explode(',', $pattern);
            $count = count($parts);
            foreach($parts as $key => $part) {
                switch ($part) {
                    case '#':
                    case '-#':
                        if ($part[0] == '-') {
                            $regex[$pkey] .= '[' . $symbols['minus'] . '-]{0,1}';
                        } else {
                            $regex[$pkey] .= '[' . $symbols['plus'] . '+]{0,1}';
                        }
    
                        if (($parts[$key + 1]) == '##0')  {
                            $regex[$pkey] .= '[0-9]{1,3}';
                        } else if (($parts[$key + 1]) == '##') {
                            $regex[$pkey] .= '[0-9]{1,2}';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 1):"' . $pattern . '"');
                        }
                        break;
                    case '##':
                        if ($parts[$key + 1] == '##0') {
                            $regex[$pkey] .=  '(\\' . $symbols['group'] . '{0,1}[0-9]{2})*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 2):"' . $pattern . '"');
                        }
                        break;
                    case '##0':
                        if ($parts[$key - 1] == '##') {
                            $regex[$pkey] .= '[0-9]';
                        } else if (($parts[$key - 1] == '#') || ($parts[$key - 1] == '-#')) {
                            $regex[$pkey] .= '(\\' . $symbols['group'] . '{0,1}[0-9]{3})*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 3):"' . $pattern . '"');
                        }
                        break;
                    case '#0':
                        if ($key == 0) {
                            $regex[$pkey] .= '[0-9]*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 4):"' . $pattern . '"');
                        }
                        break;
                }
            }
        }
    

By:

        if (strpos($pattern, ',') !== false) {
            $parts = explode(',', $pattern);
            $count = count($parts);
            $flag = false;
            foreach($parts as $key => $part) {
                switch ($part) {
                    case '#':
                    case '-#':
                        if ($part[0] == '-') {
                            $regex[$pkey] .= '[' . $symbols['minus'] . '-]{0,1}';
                        } else {
                            $regex[$pkey] .= '[' . $symbols['plus'] . '+]{0,1}';
                        }

                        if (($parts[$key + 1]) == '##0')  {
                            $regex[$pkey] .= '[0-9]{1,3}';
                        } else if (($parts[$key + 1]) == '##') {
                            $regex[$pkey] .= '[0-9]{1,2}';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 1):"' . $pattern . '"');
                        }
                        break;
                    case '##':
                        if ($parts[$key + 1] == '##0') {
                            $flag = true;
                            $regex[$pkey] .=  '(\\' . $symbols['group'] . '{0,1}[0-9]{2})*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 2):"' . $pattern . '"');
                        }
                        break;
                    case '##0':
                        if ($parts[$key - 1] == '##' && !$flag) {
                            $regex[$pkey] .= '[0-9]';
                        } else if (($parts[$key - 1] == '#') || ($parts[$key - 1] == '-#') || (($parts[$key - 1] == '##') && $flag)) {
                            $regex[$pkey] .= '(\\' . $symbols['group'] . '{0,1}[0-9]{3})*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 3):"' . $pattern . '"');
                        }
                        break;
                    case '#0':
                        if ($key == 0) {
                            $regex[$pkey] .= '[0-9]*';
                        } else {
                            throw new Zend_Locale_Exception('Unsupported token for numberformat (Pos 4):"' . $pattern . '"');
                        }
                        break;
                }
            }
        }

我添加了一个$flag可以管理 ' 的十进制形式的变量#,##,##0.###'
我做了一些测试,看起来可以运行。

如果不是正则表达式方面的专家,请毫不犹豫地给我退货。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend_Validate_Float 语言环境不适用于 hi_IN 语言环境 的相关文章

随机推荐