使用' 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修复此问题。
提前致谢。
答案 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.###
”的小数形式
我做了一些测试,它看起来很流行。
不是常客表达的专家,请不要犹豫,给我一个回报。
:)