【问题标题】:Converting a string to a new format将字符串转换为新格式
【发布时间】:2020-02-13 23:25:06
【问题描述】:

我正在运行一个 C# 应用程序,它以 MM/DD/YYYY 格式提取日期字符串,但当日期小于 10 时,数据以 MM/D/YYYY 出现。 (即:它提取2/4/2020..而不是2/04/2020)。

我将数据存储在 strDateExtracted 变量中。

当我粘贴/放置数据时,应用程序要求我将其输入为MMDDYYYY

例如,如果我提取2/4/2020,应用程序希望我输入02042020

我需要将该字符串从MM/DD/YYYY 转换为MMDDYYYY,如果day 大于9,则将MMDYYYY 转换为MM/0D/YYYY

有什么想法吗?

【问题讨论】:

  • 您可以从显示无法正常工作的代码开始... :)
  • string result = DateTime.Parse(inputString).ToString("MM/dd/yyyy");
  • 您说,“我需要将该字符串从 MM/DD/YYYY 转换为 MMDDYYYY,如果 day 大于 9,则将 MMDYYYY 转换为 MM/0D/YYYY” .在第一个示例中,输入有正斜杠,而输出没有。在第二个例子中,情况正好相反。你能澄清一下吗?输入是否有正斜杠?输出是否也有它们?
  • 另外,不知道为什么要将DateTime 保存在string 中。这只是一个格式化的表示,但是如果你想对它做任何事情而不是显示它,对象本身应该存储为DateTime

标签: c# if-statement variables formatting


【解决方案1】:

我能想到两种可能的方法。

第一种方式,基本上是将字符串转换为DateTime 并将其格式化回所需的格式:

public string GetDate(string input)
{
    return DateTime.Parse(input).ToString("MM/dd/yyyy");
}

另一种可能更快的方法是自行拆分字符串并自行添加0

public string GetDate(string input)
{
    var items = input.Split('/');

    if(items[0].Length == 1)
    {
        items[0] = "0" + items[0];
    }

    if(items[1].Length == 1)
    {
        items[1] = "0" + items[1];
    }

    return string.Join("/", items);
}

请注意,这当然是基于猜测,输入和所需输出都是字符串。

【讨论】:

    【解决方案2】:

    根据您的输入,我们假设输入有 8、9 或 10 个字符并且格式正确,例如

    12/12/2020 (10 chars)
    2/12/2020 (9 chars)
    12/2/2020 (9 chars)
    2/2/2020 (8 chars)
    

    我们可以创建一个 C# 8.0 switch expression,在输入中使用 ranges/indices 返回正确的字符串。可以说,这是过度设计的,但可能有助于避免由于字符串拆分而导致的分配等等。

    完整的程序如下,你可以用这个.NET Fiddle运行它。

    using System;
    
    namespace Dates
    {
        class Program
        {
            static void Main(string[] args)
            {
                var input = "12/12/2020";
                Console.WriteLine(GetWithoutSlashes(input));
                input = "2/12/2020";
                Console.WriteLine(GetWithoutSlashes(input));
                input = "12/2/2020";
                Console.WriteLine(GetWithoutSlashes(input));
                input = "2/2/2020";
                Console.WriteLine(GetWithoutSlashes(input));
    
            }
    
            static string GetWithoutSlashes(string input)
            {
                return input.Length switch
                {
                    // First two digits (month), third/fourth digits (day), last 4 digits (year)
                    10 => $"{input[..2]}{input[3..5]}{input[^4..]}",
    
                    9 => input[1] == '/'
                        // Single digit month with zero before it, double digit day, last 4 digit year
                        ? $"0{input[0]}{input[2..4]}{input[^4..]}"
                        // First two digits for month, single digit day with a zero before it, year
                        : $"{input[..2]}0{input[3]}{input[^4..]}",
    
                    // Single digit month, day with zero before each, last 4 digit year
                    8 => $"0{input[0]}0{input[2]}{input[^4..]}",
    
                    _ => throw new ArgumentException("Bad input!", nameof(input))
                };
            }
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2011-09-06
      • 2020-12-05
      相关资源
      最近更新 更多