我正在尝试将字符串解析为小数,如果字符串中小数点后面的位数超过2位,则解析失败。
e.g:
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");
有什么建议吗?
答案 0 :(得分:4)
看看Regex
。这个主题有各种各样的主题。
例如: Regex to match 2 digits, optional decimal, two digits
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
答案 1 :(得分:1)
我在stackoverflow中找到了解决方案:
(由carlosfigueira发表:C# Check if a decimal has more than 3 decimal places?)
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;
}
答案 2 :(得分:1)
可能没有提出的其他选项那么优雅,但我认为有点简单:
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();
答案 3 :(得分:0)
或者你可以做一些简单的整数数学:
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 );
}
}