簡體   English   中英

替換非數字字符串中的小數點分隔符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM