gpt4 book ai didi

validation - 如何使用Google的Dart编程语言将用户输入的分数和小数转换并验证为小数?

转载 作者:行者123 更新时间:2023-12-03 03:28:22 25 4
gpt4 key购买 nike

我想要一种方法,它接受用户输入的分数或十进制数,然后对其进行验证(以合理的宽容方式),然后将其转换为十进制数。

对于其他编程语言,也曾提出过类似的问题,但它们似乎都依赖于eval(),而eval()似乎不存在于Dart中,仅允许使用分数,或者要求输入已经有效。

我希望它以以下方式处理用户输入:

    //generic
print("'5': expect:5, actual:" + fractionStringToNum("5").toString());
print("'5/8': expect:0.625, actual:" + fractionStringToNum("5/8").toString());
print("'5 5/8': expect:5.625, actual:" + fractionStringToNum("5 5/8").toString());
print("'5 10/8': expect:6.25, actual:" + fractionStringToNum("5 10/8").toString());
print("'5.625': expect:5.625, actual:" + fractionStringToNum("5.625").toString());
print("'3 1/3': expect:3.33333, actual:" + fractionStringToNum("3 1/3").toString());
print("'0.625': expect:0.625, actual:" + fractionStringToNum("0.625").toString());
print("'.625': expect:0.625, actual:" + fractionStringToNum(".625").toString());
print("'0': expect:0, actual:" + fractionStringToNum("0").toString());

//negatives
print("'-5': expect:-5, actual:" + fractionStringToNum("-5").toString());
print("'- 5': expect:NaN, actual:" + fractionStringToNum("- 5").toString());
print("'-5.625': expect:-5.625, actual:" + fractionStringToNum("-5.625").toString());
print("'-5 5/8': expect:-5.625, actual:" + fractionStringToNum("-5 5/8").toString());
print("'5/-8': expect:-0.625, actual:" + fractionStringToNum("5/-8").toString());
print("'5 5/-8': expect:4.375, actual:" + fractionStringToNum("5 5/-8").toString());
print("'-5/-8': expect:0.625, actual:" + fractionStringToNum("-5/-8").toString());
print("'-5 5/-8': expect:-4.375, actual:" + fractionStringToNum("-5 5/-8").toString());
print("'- 5 - 5/8': expect:NaN, actual:" + fractionStringToNum("- 5 - 5/8").toString());
print("'--5': expect:NaN, actual:" + fractionStringToNum("--5").toString());
print("'-5-': expect:NaN, actual:" + fractionStringToNum("-5-").toString());
print("'-asdf': expect:NaN, actual:" + fractionStringToNum("-asdf").toString());
print("'- asdf': expect:NaN, actual:" + fractionStringToNum("- asdf").toString());

//spaces
print("' 5 5/8': expect:5.625, actual:" + fractionStringToNum(" 5 5/8").toString());
print("'5 5/8': expect:5.625, actual:" + fractionStringToNum("5 5/8").toString());
print("'5 / 8': expect:0.625, actual:" + fractionStringToNum("5 / 8").toString());
print("'5 5 / 8': expect:5.625, actual:" + fractionStringToNum("5 5 / 8").toString());
print("'- 5 5/8': expect:NaN, actual:" + fractionStringToNum("- 5 5/8").toString());
print("'5 5': expect:NaN, actual:" + fractionStringToNum("5 5").toString());
print("'5 .8': expect:NaN, actual:" + fractionStringToNum("5 .8").toString());
print("'5 5 5/8': expect:NaN, actual:" + fractionStringToNum("5 5 5/8").toString());
print("'5 5.8': expect:NaN, actual:" + fractionStringToNum("5 5.8").toString());
print("'5 5 .8': expect:NaN, actual:" + fractionStringToNum("5 5 .8").toString());

//fractions
print("'5/5.625': expect:0.88888, actual:" + fractionStringToNum("5/5.625").toString());
print("'5.625/8': expect:0.703125, actual:" + fractionStringToNum("5.625/8").toString());
print("'5/.625': expect:8, actual:" + fractionStringToNum("5/.625").toString());
print("'.625/8': expect:0.078125, actual:" + fractionStringToNum(".625/8").toString());
print("'0/8': expect:0, actual:" + fractionStringToNum("0/8").toString());
print("'0.625/0.625': expect:1, actual:" + fractionStringToNum("0.625/0.625").toString());
print("'.625/.625': expect:1, actual:" + fractionStringToNum(".625/.625").toString());
print("'5/0': expect:Infinity, actual:" + fractionStringToNum("5/0").toString());
print("'0/0': expect:NaN, actual:" + fractionStringToNum("0/0").toString());
print("'1 0/8': expect:1, actual:" + fractionStringToNum("1 0/8").toString());
print("'1 5/0': expect:Infinity, actual:" + fractionStringToNum("1 5/0").toString());
print("'1 0/0': expect:NaN, actual:" + fractionStringToNum("1 0/0").toString());
print("'1/1/1970': expect:NaN, actual:" + fractionStringToNum("1/1/1970").toString());
print("'1/1 1': expect:NaN, actual:" + fractionStringToNum("1/1 1").toString());
print("'5/8 5/8': expect:NaN, actual:" + fractionStringToNum("5/8 5/8").toString());

//strings
print("'': expect:NaN, actual:" + fractionStringToNum("").toString());
print("'asdf': expect:NaN, actual:" + fractionStringToNum("asdf").toString());
print("'5/asdf': expect:NaN, actual:" + fractionStringToNum("5/asdf").toString());
print("'asdf/8': expect:NaN, actual:" + fractionStringToNum("asdf/8").toString());
print("'asdf/ghjkl': expect:NaN, actual:" + fractionStringToNum("asdf/ghjkl").toString());
print("'5 asdf/ghjkl': expect:NaN, actual:" + fractionStringToNum("5 asdf/ghjkl").toString());
print("'asdf.625': expect:NaN, actual:" + fractionStringToNum("asdf.625").toString());
print("'5.asdf': expect:NaN, actual:" + fractionStringToNum("5.asdf").toString());
print("'1 / asdf': expect:NaN, actual:" + fractionStringToNum("1 / asdf").toString());

//misc
print("'.625.625': expect:NaN, actual:" + fractionStringToNum(".625.625").toString());
print("'.625 .625': expect:NaN, actual:" + fractionStringToNum(".625 .625").toString());
print("'5.625 5/8': expect:NaN, actual:" + fractionStringToNum("2.1 1/2").toString());
print("'.625 5/8': expect:NaN, actual:" + fractionStringToNum("2.1 1/2").toString());

最佳答案

我想您尝试匹配的语法是:

fraction ::= signed_number
| signed_number / signed_number
| signed_number number / signed_number
signed_number ::= number | '-' number
number ::= digit* '.' digit+ | digit+

允许使用空格。在做复杂的事情时,始终确保在开始之前知道自己在做什么。对于解析,通常是关于编写语法的。

使用RegExp进行解析(不一定更好,只是更短),我会这样做:

num fractionStringToNum(String string) {
var numRE = r"\d*(?:\.\d+|\d)";
var fracRE = "^\\s*(-)?($numRE)(?:\\s+($numRE))?(?:\\s*/\\s*(-)?($numRE))?\\s*\$";
var re = new RegExp(fracRE);
var match = re.firstMatch(string);
if (match == null) return double.NAN;
num result = num.parse(match[2]);
if (match[3] != null) {
double num2 = double.parse(match[3]);
if (match[5] == null) return double.NAN;
double num3 = double.parse(match[5]);
// if (match[4] == '-') result = -result; // Don't want to do this.
result += num2 / num3;
} else if (match[5] != null) {
result /= double.parse(match[5]);
}
if (match[1] != match[4]) result = -result;
return result;
}

这符合您的大多数测试用例,但不同意“5 5 / -8”。我只希望禁止使用该表达式(当您使用复合表达式时为负数除数),因为我看不到对此的任何明显解释-并且不止一个显而易见。
我将修复程序放入代码中,但是将其注释掉,因为我不喜欢它:)

关于validation - 如何使用Google的Dart编程语言将用户输入的分数和小数转换并验证为小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com