以(已知)国家格式验证十进制数

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.71..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.51,000.50 一样有效。)【参考方案5】:

您执行所有计算,对于结果变量,您可以使用内置函数 number_format 根据您的要求对其进行格式化。

【讨论】:

我不想从浮点数转换为字符串。我想验证字符串是否包含国家格式的有效数字。 12.345 是一个有效数字,但我不能将它存储在 DECIMAL(4,2) 列中。 1000 是有效号码,但不是有效折扣。

以上是关于以(已知)国家格式验证十进制数的主要内容,如果未能解决你的问题,请参考以下文章

格式化任何位置的十进制数

以IEEE754短浮点数格式表示十进制数:-3.125 要求写出过程,并最终用十六进制缩写形式表示

使用 jquery 和 regex 格式化正负十进制数

补码验证

十进制数格式问题

十进制数的正则表达式(最多 3 个带逗号的十进制数)