在c#中将字符串解析为十进制时,无法限制十进制数字的数量
本文关键字:十进制数字 字符串 十进制 | 更新日期: 2023-09-27 18:15:40
我正在尝试将字符串解析为小数,如果在字符串的小数点后有超过2位数字,解析应该失败。
例句:
1.25
有效,但1.256
无效。
我试图在c#中使用decimal.TryParse
方法以以下方式解决,但这没有帮助…
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 2;
if (!decimal.TryParse(test, NumberStyles.AllowDecimalPoint, nfi, out s))
{
Console.WriteLine("Failed!");
return;
}
Console.WriteLine("Passed");
有什么建议吗?
看看Regex
。有各种各样的线程涵盖这个主题。
的例子:Regex匹配2位数字,可选的十进制,两位数
Regex decimalMatch = new Regex(@"[0-9]?[0-9]?('.[0-9]?[0-9]$)");
这应该在您的情况下完成。
var res = decimalMatch.IsMatch("1111.1"); // True
res = decimalMatch.IsMatch("12111.221"); // False
res = decimalMatch.IsMatch("11.21"); // True
res = decimalMatch.IsMatch("11.2111"); // False
res = decimalMatch.IsMatch("1121211.21143434"); // false
我在stackoverflow中找到了解决方案:
(由carlosfigueira发布:c#检查小数是否有超过3位?)
static void Main(string[] args)
{
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalDigits = 2;
decimal s;
if (decimal.TryParse("2.01", NumberStyles.AllowDecimalPoint, nfi, out s) && CountDecimalPlaces(s) < 3)
{
Console.WriteLine("Passed");
Console.ReadLine();
return;
}
Console.WriteLine("Failed");
Console.ReadLine();
}
static decimal CountDecimalPlaces(decimal dec)
{
int[] bits = Decimal.GetBits(dec);
int exponent = bits[3] >> 16;
int result = exponent;
long lowDecimal = bits[0] | (bits[1] >> 8);
while ((lowDecimal % 10) == 0)
{
result--;
lowDecimal /= 10;
}
return result;
}
可能没有其他选项那么优雅,但我认为更简单:
string test= "1,23"; //Change to your locale decimal separator
decimal num1; decimal num2;
if(decimal.TryParse(test, out num1) && decimal.TryParse(test, out num2))
{
//we FORCE one of the numbers to be rounded to two decimal places
num1 = Math.Round(num1, 2);
if(num1 == num2) //and compare them
{
Console.WriteLine("Passed! {0} - {1}", num1, num2);
}
else Console.WriteLine("Failed! {0} - {1}", num1, num2);
}
Console.ReadLine();
或者你可以做一些简单的整数运算:
class Program
{
static void Main( string[] args )
{
string s1 = "1.25";
string s2 = "1.256";
string s3 = "1.2";
decimal d1 = decimal.Parse( s1 );
decimal d2 = decimal.Parse( s2 );
decimal d3 = decimal.Parse( s3 );
Console.WriteLine( d1 * 100 - (int)( d1 * 100) == 0);
Console.WriteLine( d2 * 100 - (int)( d2 * 100) == 0);
Console.WriteLine( d3 * 100 - (int)( d3 * 100 ) == 0 );
}
}