在使用“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(使用前将#替换为@)