字符串替换中的手动文化转换

时间:2016-12-08 22:27:51

标签: c#

很抱歉,如果非常基本的问题,但不知怎的,我找不到一个简单的解决方案。

我想手动转换字符串中的点和逗号。

要求

每个字符串在最后3个字符之前应该只包含一个逗号 每个字符串可以包含每个3个字符的一个点

XXX.XXX.XXX,XXX

如何将输入转换为以下输出:

 1. Input= 102.123.444,696  output = no change
 2. Input= 102,123,444.666  output = 102.123.444,696
 3. Input= 444.666          output = 444,666
 4. input= 123,444.666      output = 123.444,666
 5. input= 0.666            output = 0,666
 6. input= .666             output= 0,666
 7. input= ABC,CCC.DD       output= ABC.CCC,DD
 8. input= .abc             output= 0,abc

4 个答案:

答案 0 :(得分:2)

您应该将数字解析为原始文化的两倍,并将ToString解析为其他文化。

double number = double.Parse("102.123.444,696", new CultureInfo("culturecode"));
string output = number.ToString("N", new CultureInfo("otherculturecode");

你应该在哪里替换" culturecode"使用原产地文化代码(" en-US"例如)和"其他文化代码"目的地文化代码。

答案 1 :(得分:0)

我相信你会在这里找到你想要的解决方案:

https://msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx

答案 2 :(得分:0)

这段代码做了很多假设并且依赖于ascii字符,即,如果它们存在,这将不适用于奇怪的Unicode逗号或句点。它假设字符串已经处于有效格式之前,只需将逗号更改为句点,反之亦然,条件是如果第一个分隔符在扫描右边时发现 - >左边是逗号,则不需要更改,但如果是一个句点然后用句点交换所有逗号,反之亦然。我没有处理将前导0添加到只有小数位的情况。我认为将此代码仅用于字母表案例并在有实际数字时使用文化信息答案是明智的。

List<string> strings = new List<string>() { "102.123.444,696", "102,123,444.666",
            "444.666", "123,444.666", "0.666", ".666", "ABC,CCC.DD", ".abc" };
List<string> outputStrings = new List<string>();

foreach (var s in strings)
{
    // Scan from right. If find ',' first, no changes, otherwise replace everything found
    bool foundPeriod = false;
    bool foundComma = false;
    bool foundCommaFirst = false;
    string outputString = string.Empty;
    foreach (var character in s.Reverse())
    {
        if (character == '.')
        {
            foundPeriod = true;
        }

        if (character == ',')
        {
            foundComma = true;
        }

        if (!foundComma && foundPeriod)
        {
            foundCommaFirst = true;
        }

        if (foundCommaFirst)
        {
            // This means we need to replace everything with the opposite
            // Create the string backwards then reverse it later to make life easier
            if (character == ',')
            {
                outputString += ".";
            }
            else if (character == '.')
            {
                outputString += ",";
            }
            else
            {
                outputString += character;
            }
        }
        else
        {
            outputString += character;
        }
    }

    // Reverse it
    var charArray = outputString.ToCharArray();
    Array.Reverse(charArray);
    outputString = new string(charArray);

    outputStrings.Add(outputString);
}

答案 3 :(得分:0)

这是一种可能的解决方案。它根据你给出的样本做了一些假设,但是如果没有更完整的要求,它可能是你能得到的最好的:

public string UseCommasForDecimals(string input)
{
    string[] split = input.Split(',', '.');
    var fraction = split.Last();
    var wholeNumber = string.Join(".", split.Take(split.Length - 1));
    if (wholeNumber.Length == 0)
    {
        wholeNumber = "0";
    }
    return wholeNumber + "," + fraction;
}