我有一系列混合值:
$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.
}
我调查了两个相关问题,但找不到合适的解决方案。
有人能提供一个实际的例子吗?
答案 0 :(得分:7)
您不需要使用正则表达式。
使用str_replace()
,因为您需要替换','
的{{1}},然后使用'.'
或intval()
函数来获取数值。您还可以使用floatval()
查找strstr()
并决定是否使用'.'
或intval()
示例:
floatval()
我们使用str_replace()替换逗号的点,这样它就是国际符号浮点数,即使它在字符串上也是如此,以后我们可以检查它是否为#s;带$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);
的数字< - 这个函数非常棒,因为它检测到字符串是否为数字,无论是整数还是浮点数等。
我们使用is_numeric检查值是整数float还是text并使用is_numeric()
或intval()
返回相应的值(未应用replace的值不会返回有效数字,仅切换后,和。它将返回true作为数字)。
我们使用floatval()
将更改应用于数组。
利润xD
答案 1 :(得分:1)
$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 +
答案 2 :(得分:1)
多年后我才做出回应,因为我认为提供的任何解决方案都不够可靠。
这是一个更严格的测试,如果一个字符串包含一个以逗号作为小数点分隔符的浮点数,如果是,则转换它。如果需要,它还会删除数字周围的空格。它并没有真正测试格式错误的数字。
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 ;
答案 3 :(得分:0)
使用is_numeric
进行测试,number_format
进行格式化
foreach ($row as &$value) {
$number = str_replace(',','.');
if(is_numeric($number))
$value = number_format($number, 2, '.', '');
}
unset($value);