我有一个混合值数组:
$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); -1,94 -1,55
正如您所看到的,它包含文本以及负数和正数逗号。
我需要将数值转换为正确的数字格式,并保持文本值不变。
现在我循环遍历这些值:
foreach ($row as $value) {
// If $value is numeric, convert it to the
// right number format for use with MySQL (decimal(10,2))
// If not, leave it be.
}
我调查了两个相关的问题,但找不到合适的解决方案。
- 将逗号作为小数点的数字转换为浮点
- 我需要php正则表达式的数值,包括"-"以及">
有人能提供一个实际的例子吗?
您不需要使用正则表达式。
使用str_replace()
,因为需要将','
替换为'.'
,然后使用intval()
或floatval()
函数来获取数值。您也可以使用strstr()
查找'.'
,并决定使用intval()
还是floatval()
示例:
$row = array('Unspecified risk', 'Yes', '8', '3', '2', '13', 'none', '-1,49', '-2,51', '-1,46', '-1,54');
function toNumber($target){
$switched = str_replace(',', '.', $target);
if(is_numeric($target)){
return intval($target);
}elseif(is_numeric($switched)){
return floatval($switched);
} else {
return $target;
}
}
$row = array_map('toNumber', $row);
var_dump($row);
我们使用str_replace((来替换逗号的点,这样它就是一个国际符号float,即使它在字符串上,这样以后我们可以检查它是否是带有is_numeric()
<的数字这个函数非常棒,因为它可以从字符串中检测它是否是数字,无论是整数还是浮点等。
我们使用is_numeric来检查该值是整数浮点值还是文本值,并使用intval()
或floatval()
返回相应的值(只有在切换和之后,未应用替换的值才会作为有效数字返回(。它将作为数字返回true。
我们使用$row = array_map('toNumber', $row);
将更改应用于数组。
利润xD
$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54');
foreach($row as $key => $var) {
if(strstr($var, ",") && !is_numeric($var)) {
$var1 = str_replace(",","", $var);
if(is_numeric($var1)) {
$decimal = strstr($var, ',', TRUE);
$digits = str_replace($decimal, "", $var1);
$finalValue = $digits * pow(10,$decimal);
$row[$key] = $finalValue;
}
}
}
echo "<pre>"; print_r($row);
注意:这将适用于php 5.3或php 5.3+
我这么多年后才做出回应,因为我觉得提供的任何解决方案都不够可靠。
如果一个字符串包含一个以逗号作为小数分隔符的浮点值,则这是一个更严格的测试,如果是,则转换它。如果需要,它还会删除数字周围的空格。它并不能真正测试格式错误的数字。
if( preg_match('/^'s*[0-9'.]*,'d*'s*$/', $str))
return (float)str_replace(",",".",str_replace(".","",trim($str)));
else
return $str ;
如果你知道一个数值总是有欧洲符号(所以没有逗号的1.234也应该被转换为1234(,它应该是:
if( preg_match('/^'s*[0-9'.]*,?'d*'s*$/', $str))
return (float)str_replace(",",".",str_replace(".","",trim($str)));
else
return $str ;
如果你想要一个真正严格的测试,没有格式错误的数字(比如以千分隔符开头(,并且在千分隔符之间只使用三位数字(但并非所有国家都使用三位,比如印度!(:
if( preg_match('/^'s*'d{0,3}((?<='d)'.'d{3})*,?'d*'s*$/', $str))
return (float)str_replace(",",".",str_replace(".","",trim($str)));
else
return $str ;
最后,如果你想变得更加严格,也不希望数字能够以逗号开头或结尾("1.234,"或",17",在某些情况下被认为是正确的(,它就变成了
if( preg_match('/^'s*'d{1,3}((?<='d)'.'d{3})*(,'d+)*'s*$/', $str))
return (float)str_replace(",",".",str_replace(".","",trim($str)));
else
return $str ;
使用is_numeric
进行测试,使用number_format
进行格式化:
foreach ($row as &$value) {
$number = str_replace(',', '.', $value);
if (is_numeric($number)) {
$value = number_format($number, 2, '.', '');
}
}
unset($value);