javascript中的标题大小写和缩写

title casing and Abbreviations in javascript

本文关键字:缩写 大小写 标题 javascript      更新时间:2023-09-26

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

示例(这些字符串被连接为公司名称,该名称采用标题大小写,符号在括号中):AT&T (T)
约翰迪尔公司(DE)

这些公司名称来自我们的数据库,该数据库从股票定价服务中提取它们。我让它工作,除了名字是缩写的时候,比如AT&T

这是return,你猜对了,就像At&t一样。如何在缩写中保留大小写?我想使用indexof来获取任何& & &的位置,并将其两侧的两个字符大写,但这似乎有点粗俗。

(伪代码)

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

哎呀,忘了包含titlecase函数

function toTitleCase(str) {
    return str.replace(/([^'W_]+[^'s-]*) */g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
}
有更好的建议吗?

一个更好的标题大小写函数可能是

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;

当然,如果你一开始就能正确输入数据,就会省去很多麻烦

这是标题大小写的一般解决方案,无需考虑"缩写"的额外要求:

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

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

然而,您当然可以在某些例外情况下编程,尽管我仍然不确定简单地假设任何带有&号的单词都应该是大写的。但这可以像这样完成:

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

请注意,您的第二个示例"约翰迪尔公司(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);

至少可以正确处理你的两个例子

这样如何:由于在证券交易所注册的公司数量是有限的,而且股票代码和公司名称之间有一个定义良好的映射,您最好的方法可能是将这种映射编程到您的代码中,通过股票代码缩写查找公司名称,像这样:

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

然后从股票代码中查找公司名称:

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

当然,如果没有某种Web服务,你可以调用从股票代码中获取公司名称,我会非常惊讶,就像下面这个线程:股票代码查找API

或者可能在股票定价服务中有一些类似的功能,您首先使用它们来获取数据。

上次我遇到这种情况时,我决定在需要的时候简单地在这里和那里包含一些例外情况,这会减少麻烦。

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;
}