标题大小写和javascript中的缩写

时间:2014-05-13 00:13:24

标签: javascript

我正在尝试将一些包含公司名称及其股票代码的文本标题化。

示例(这些字符串连接为公司名称,其中包含标题和parens中的符号):AT& T(T)
         John Deere Inc.(DE)

这些公司名称来自我们的数据库,它从股票定价服务中提取。当名称是AT& T

这样的缩写时,我有它工作除外

那是回归,你猜对了,就像At& t。如何在缩写中保留套管。我想用indexof来获取任何& s的位置,并在它的两边用大写两个字符,但这似乎是hackish。

沿着(伪代码)

var indexPos = myString.indexOf("&");
var fixedString = myString.charAt(indexPos - 1).toUpperCase().charAt(indexPos + 1).toUpperCase()

糟糕,忘了包含我的标题功能

function toTitleCase(str) {
    return str.replace(/([^\W_]+[^\s-]*) */g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
}

有更好的建议吗?

4 个答案:

答案 0 :(得分:3)

更好的标题案例功能可能是

function toTitleCase(str) {
    return str.replace(
        /(\b.)|(.)/g,
        function ($0, $1, $2) {
            return ($1 && $1.toUpperCase()) || $2.toLowerCase();
        }
    );
}
toTitleCase("foo bAR&bAz a.e.i."); // "Foo Bar&Baz A.E.I."

这仍然会将 AT& T 转换为 At& T ,但是没有任何信息可以写入知道该怎么做做,最后

// specific fixes
     if (str === "At&T"  ) str = "AT&T";
else if (str === "Iphone") str = "iPhone";
// etc 
// or
var dict = {
    "At&T": "AT&T",
    "Iphone": "iPhone"
};
str = dict[str] || str;

虽然当然如果你能在第一时间输入数据时做到这一点,它将为你节省很多麻烦

答案 1 :(得分:1)

这是标题案例的一般解决方案,不考虑您对“缩写”的额外要求:

  var fixedString = String(myString).toLowerCase().replace(/\b\w/g, String.toUpperCase);

虽然我同意其他海报,但最好首先以正确的格式开始使用数据。并非所有专有名称都符合标题案例,只有几个例子是“Werner von Braun”和“Ronald McDonald”。实际上没有算法可以编程到计算机中来处理专有名称的任意大写,就像你不能真正编程计算机来拼写检查专有名称一样。

然而,你当然可以在一些例外情况下编程,虽然我仍然不确定是否只是假设任何带有&符号的单词都应该在所有大写字母中也是合适的。但这可以这样完成:

var titleCase = String(myString).toLowerCase().replace(/\b\w/g, String.toUpperCase);
var fixedString = titleCase.replace(/\b\w*\&\w*\b/g, String.toUpperCase);

请注意,您的第二个“John Deere Inc.(DE)”示例仍未正确处理。我想你可以添加一些其他的逻辑来说,在所有大写的括号中加上任何字,如下:

var titleCase = String(myString).toLowerCase().replace(/\b\w/g, String.toUpperCase);
var titleCaseCapAmps = titleCase.replace(/\b\w*\&\w*\b/g, String.toUpperCase);
var fixedString = titleCaseCapAmps.replace(/\(.*\)/g, String.toUpperCase);

至少会正确处理你的两个例子。

答案 2 :(得分:1)

这个怎么样:由于证券交易所注册公司的数量是有限的,并且a well-defined mapping between stock symbols and company names,你最好的可能就是将这个映射编入你的代码,通过自动收报机查找公司名称缩写,像这样:

var TickerToName = 
{
    A: "Agilent Technologies",
    AA: "Alcoa Inc.",
    // etc., etc.
}

然后,这只是一个简单的查找,从股票代码中获取公司名称:

var symbol = "T";
var CompanyName = TickerToName[symbol] || "Unknown ticker symbol: " + symbol;

当然,如果没有某种Web服务可以通过股票代码符号取回公司名称,我会非常惊讶,就像在这个帖子中一样: Stock ticker symbol lookup API

或者在您首先获得数据的股票定价服务中可能会有类似这样的功能。

答案 3 :(得分:0)

上次我遇到这种情况时,我认为只需在这里和那里包含少数例外情况就不那么麻烦了。

var titleCaseFix = {
  "At&t": "AT&T"
}


var fixit(str) {
  foreach (var oldCase in titleCaseFix) {
    var newCase = titleCaseFix[oldCase];

    // Look here for various string replace options:
    // http://stackoverflow.com/questions/542232/in-javascript-how-can-i-perform-a-global-replace-on-string-with-a-variable-insi    


  }
  return str;
}