以(已知)国家格式验证十进制数
Posted
技术标签:
【中文标题】以(已知)国家格式验证十进制数【英文标题】:Validate decimal number in (known) national format 【发布时间】:2010-05-31 09:40:38 【问题描述】:php 有许多内置函数来验证数字,但它们都希望以 computer 格式输入:1234.56
。我需要验证 1,234.56
(英语)或 1.234,56
(西班牙语)之类的内容,以及一些典型属性(可接受的范围、最大小数位数等)。
我开始编写自己的函数,但很快就迷路了。 读取用户输入到浮点变量中很容易,但我希望能够检测具有无效格式的数字,例如 1,23456.7
或 1..25
。
你对这个主题有什么建议吗?
(事先知道十进制和千位字符,可以将数字组硬编码为三个,无需覆盖Indian number format。)
【问题讨论】:
【参考方案1】:查看NumberFormatter::parse
。您可以使用它解析许多语言环境中的数字。整个 intl 扩展很有用,尽管它还没有完全“存在”。
【讨论】:
不幸的是,只能在 PHP 5.3+ 中工作,但无论如何都很好的解决方案,不知道。【参考方案2】:我在 php 手册的评论中发现了一个有趣的函数:http://fr2.php.net/manual/en/language.types.float.php#92885 看看吧。
【讨论】:
虽然没有直接应用于我的问题,但这是一种机智的方法。太糟糕了,在遇到 Windows 实现中的一些错误后,我对 setlocale() 感到害怕。【参考方案3】:您可以使用正则表达式来验证数字:
$ds = '.'; // Decimal separator
$ts = ','; // Thousand separator
$isValidFloat = preg_match(
'/^
# Integer part, one of the two allowed formats:
# 1) with thousand separator, grouped by 3 digits
# 2) without thousand separator
(\d1,3(' . preg_quote($ts) . '\d3)* | \d+)
# Optional decimal part
(' . preg_quote($ds) . '\d+)?
$/x', $string);
然后将它转换成这样的浮点数:
$float = (float) strtr($string, array($ts => '', $ds => '.'));
【讨论】:
【参考方案4】:除了给定的解决方案之外,我建议使用PEAR Validation package 来验证数字。
这是他们网站上的一个例子:
<?php
require_once 'Validate.php';
$number = '-8,1';
if (Validate::number($number,
array('decimal' => '.,', 'min' => -9, 'max' => -7 )))
echo 'Valid';
else
echo 'Invalid';
如果您想对格式更严格,那么您可以将其解析为浮点数(您已经这样做了),然后使用number_format 将浮点数输出为您接受的格式,并尝试匹配原始格式针对您生成的任何一个。
【讨论】:
我去看看。 (最好不要这么严格:对我来说,1000.5
和1,000.50
一样有效。)【参考方案5】:
您执行所有计算,对于结果变量,您可以使用内置函数 number_format
根据您的要求对其进行格式化。
【讨论】:
我不想从浮点数转换为字符串。我想验证字符串是否包含国家格式的有效数字。12.345
是一个有效数字,但我不能将它存储在 DECIMAL(4,2) 列中。 1000
是有效号码,但不是有效折扣。以上是关于以(已知)国家格式验证十进制数的主要内容,如果未能解决你的问题,请参考以下文章