我需要正则表达式的帮助,匹配和替换模式。我正在研究费率 我的费率可以像
345.00
456
2345.90
341.34
我必须检查费率是否以9结尾,如果不是,我必须以9和$符号结束费率。
运行规则后的费率应为
$349.00
$459.00
$2349.00
$339.00
我将速率存储为字符串,以便在使用Regex.IsMatch
函数时很容易。
有人可以给我matchmattern的正则表达式并替换pattern。
我正在努力解决这个问题半天并需要帮助。
由于 萨贾塔
答案 0 :(得分:1)
更简单,更直观的方法是使用整数运算:
// convert amount to int, then:
amount = amount - (amount % 10) + 9
// or more succintly
amount += 9 - (amount % 10)
这会给你你想要的东西。然后,您可以使用String.Format()
获取货币格式:
public static String ToMoney(string amount)
{
int x = Convert.ToInt32(double.Parse(amount));
x += 9 - (x%10);
return String.Format("{0:C}", x);
}
上查看此操作
答案 1 :(得分:1)
string[] ss = { "345.00", "456", "2345.90", "341.56" };
foreach (string s in ss)
{
Console.WriteLine(Regex.Replace(s, @"^(\d*)\d(?:\.\d+)?$",
@"$$${1}9.00"));
}
输出:
$349.00
$459.00
$2349.00
$349.00
最初,(\d*)
匹配尽可能多的数字并将其存储在捕获组#1中(例如,它与341
中的341.56
匹配)。然后它退回一个位置,让\d
匹配最后一位(组#1现在只包含34
)。最后,(?:\.\d+)?
匹配分数(如果有分数)(在这种情况下为.56
)。
在替换中,$$
插入一个美元符号($
在替换中具有特殊含义,因此您必须使用另一个$
转义它。 ${1}
在34
的情况下插入捕获组#1的内容(341.56
)。通常你只能使用$1
,但这次组引用后跟替换中的另一个数字,所以看起来我指的是#19组。 1
周围的大括号毫不含糊地告诉我我想要小组#1后跟9
。最后,.00
完成了替换。
您出现的正则表达式使用命名捕获组,因此您使用${price1}
而不是${1}
来插入数字的第一部分。不需要其他两个捕获组。事实上,那里有很多东西并不属于真正的东西。我发现你现在正在删除小数部分而不是用.00
替换它。
还有一件事:在开始替换之前,您无需致电IsMatch()
;由Replace()
方法处理。
答案 2 :(得分:0)
我使用多个Regexp模式,因为这似乎不需要处理大量输入:
首先,让我们摆脱浮动:
s/\..*$//
然后,让我们处理'9':
s/.$/9/
最后,添加'$'和'.00':
s/^/$/
s/$/.00/