Zend_Validate Float语言环境不能与hi_IN语言环境一起使用

时间:2014-04-21 10:53:29

标签: zend-framework

使用' 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>';
        }
    }
}
  

上述脚本的OutPut

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修复此问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

十进制管理模式存在错误 但ZF1(据我所知)不再维持。

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

  • 首先是在您的号码前添加'0'。 (将'1'替换为'01')。

  • 第二种是修改Zend/Local/Format.php文件 在私有静态函数_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;
                }
            }
        }
    

人:

        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.###”的小数形式 我做了一些测试,它看起来很流行。

不是常客表达的专家,请不要犹豫,给我一个回报。 :)