![](/img/trans.png)
[英]How to use locale independent decimal and numeric separator in format string?
[英]Replace decimal separator in string which is not numeric
如何用自定義分隔符替換文本中的所有小數點分隔符?
例子:
xyz,1,23.4yz
應使用點分隔符xyz,1.23.xyz
xyz,1.23.4yz
應使用逗號分隔符xyz,1,23.xyz
我為此編寫了這個測試用例:
[Theory]
[InlineData("0,05 - 2", "0,05 - 2", "0.05 - 2")]
[InlineData("0,1 ,5", "0,1 ,5", "0.1 ,5")]
[InlineData("0,1 - 2,0", "0,1 - 2,0", "0.1 - 2.0")]
[InlineData("0,234", "0,234", "0.234")]
[InlineData("123,4", "123,4", "123.4")]
[InlineData("12.345,6789", "12,345,6789", "12.345.6789")]
[InlineData("xyz,1,23.4yz", "xyz,1,23,4yz", "xyz,1.23.4yz")]
[InlineData("xyz5,1,23,xyz", "xyz5,1,23,xyz", "xyz5.1.23,xyz")]
[InlineData("0.05 - 2", "0,05 - 2", "0.05 - 2")]
[InlineData("0.1 .5", "0,1 .5", "0.1 .5")]
[InlineData("0.1 - 2.0", "0,1 - 2,0", "0.1 - 2.0")]
[InlineData("0.234", "0,234", "0.234")]
[InlineData("123.4", "123,4", "123.4")]
[InlineData("12345.6789", "12345,6789", "12345.6789")]
[InlineData("xyz.1.23.4yz", "xyz.1,23,4yz", "xyz.1.23.4yz")]
[InlineData("xyz5,1.23,xyz", "xyz5,1,23,xyz", "xyz5.1.23,xyz")]
public void Convert(string input, string resultComma, string resultDot)
{
string expectedResultComma = new ConverterDecimal(",").Convert(input);
expectedResultComma.Should().Be(resultComma);
string expectedResultDot = new ConverterDecimal(".").Convert(input);
expectedResultDot.Should().Be(resultDot);
}
我知道的唯一解決方案是檢查每個“單詞”是否為數字並將其解析為十進制。 我想知道我沒有找到解決這個問題的方法:)
讓我們嘗試以不同的方式解決 state 問題; 根據提供的示例,我們可能可以將其表示為
將由數字
0..9
包圍,
每個逗號替換為點.
如果是你的情況,你可以試試正則表達式,我們可以試試(?<=[0-9]),(?=[0-9])
模式:
(?<=[0-9]) - look behind for 0..9 digit
, - comma
(?=[0-9]) - look ahead for 0..9 digit
代碼:
using System.Text.RegularExpressions;
...
private static string ConvertMe(string source) =>
Regex.Replace(source, @"(?<=[0-9]),(?=[0-9])", ".");
演示:
string[] tests = new string[] {
"0,05 - 2",
"0,1 ,5",
"0,1 - 2,0",
"0,234",
"123,4",
"12.345,6789",
"xyz,1,23.4yz",
"xyz5,1,23,xyz",
"0.05 - 2",
"0.1 .5",
"0.1 - 2.0",
"0.234",
"123.4",
"12345.6789",
"xyz.1.23.4yz",
"xyz5,1.23,xyz",
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,20} : {ConvertMe(test)}"));
Console.Write(report);
結果:
0,05 - 2 : 0.05 - 2
0,1 ,5 : 0.1 ,5
0,1 - 2,0 : 0.1 - 2.0
0,234 : 0.234
123,4 : 123.4
12.345,6789 : 12.345.6789
xyz,1,23.4yz : xyz,1.23.4yz
xyz5,1,23,xyz : xyz5.1.23,xyz
0.05 - 2 : 0.05 - 2
0.1 .5 : 0.1 .5
0.1 - 2.0 : 0.1 - 2.0
0.234 : 0.234
123.4 : 123.4
12345.6789 : 12345.6789
xyz.1.23.4yz : xyz.1.23.4yz
xyz5,1.23,xyz : xyz5.1.23,xyz
根據@dmitry-bychenko 的回答,我想出了這個將 comman 和 dot 作為分隔符的解決方案:
public string Convert(string input, string separator)
{
string oldSeparator;
if (separator.Equals("."))
{
oldSeparator = ",";
}
else
{
oldSeparator = ".";
}
var result = Regex.Replace(input, $@"(?<=[0-9])\{oldSeparator}(?=[0-9])", separator);
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.