【问题标题】:.ToTitleCase not working on all upper case string.ToTitleCase 不适用于所有大写字符串
【发布时间】:2011-10-25 23:35:02
【问题描述】:
Public Function TitleCase(ByVal strIn As String)
      Dim result As String = ""
      Dim culture As New CultureInfo("en", False)
      Dim tInfo As TextInfo = culture.TextInfo()
      result = tInfo.ToTitleCase(strIn)
      Return result
 End Function

如果我在上面的函数中输入“TEST”。输出为“测试”。理想情况下它会输出“测试”

我也尝试了这篇文章中的代码 sn-ps 无济于事:Use of ToTitleCase

【问题讨论】:

    标签: .net asp.net vb.net


    【解决方案1】:

    如果没记错的话,ToTitleCase() 似乎永远不会对所有大写字符串都有效。它基本上要求您在处理之前将字符串转换为小写。

    来自 MSDN:

    通常,标题大小写将单词的第一个字符转换为 大写,其余字符为小写。然而,这 方法当前不提供适当的大小写来转换一个单词 完全大写,例如首字母缩略词。

    解决方法用法(在 C# 中):

    string yourString = "TEST";
    
    TextInfo formatter = new CultureInfo("en-US", false).TextInfo;    
    formatter.ToTitleCase(yourString.ToLower());
    

    【讨论】:

    • 为了增加您的出色答案,还值得注意的是,您可以简单地执行以下操作:System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase(myString.ToLower()); 而不是创建多个对象。
    • 谢谢 Jamie,这似乎很适合放入一个长字符串,我无法忍受代码块中的滚动条 :)
    • @JamieDixon 如果您每次访问此类代码时都对new CultureInfo 实例不满意,则可以改用formatter = CultureInfo.GetCultureInfo("en-US").TextInfo;。这样每次都会得到 same 的缓存对象。该对象不“使用用户覆盖”(UseUserOverride)。
    • @JeppeStigNielsen 我想我不介意。已经 7 年了,发生了很多事情:)
    【解决方案2】:

    String.ToTitleCase() 也适用于大多数字符串,但对于像 McDonald 和 O'Brian 这样的名称有问题,我使用 CurrentCulture 来改变大小写。这是一个简单的扩展方法,可以处理这些:

    public string ToProperCase(this string value)
    {
    
        if (string.IsNullOrEmpty(value)) {
            return "";
        }
    
        string proper = System.Threading.Thread.CurrentThread.CurrentCulture.
                        TextInfo.ToTitleCase(value.ToLower());
    
        int oddCapIndex = proper.IndexOfAny({
            "D'",
            "O'",
            "Mc"
        });
    
    
        if (oddCapIndex > 0) {
            // recurse
            proper = proper.Substring(0, oddCapIndex + 2) +
                     proper.Substring(oddCapIndex + 2).ToProperCase();
    
        }
    
        return proper;
    
    }
    

    还有 IndexOfAny(String[]) 扩展:

    public int IndexOfAny(this string test, string[] values)
    {
        int first = -1;
        foreach (string item in values) {
            int i = test.IndexOf(item);
            if (i > 0) {
                if (first > 0) {
                    if (i < first) {
                        first = i;
                    }
                } else {
                    first = i;
                }
            }
        }
        return first;
    }
    

    【讨论】:

      【解决方案3】:

      关于答案 1,这是个好主意,但代码无法编译;并且,当更正语法时,它不起作用。我没有时间调试它,但如果你想使用它,你将需要它。部分问题是索引假定基于 1 的索引,但它们在 C# 中是基于 0 的。还有其他问题。

      【讨论】:

        猜你喜欢
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 2015-02-20
        • 2023-03-21
        • 1970-01-01
        • 2020-04-18
        相关资源
        最近更新 更多