我正在尝试将一些包含公司名称及其股票代码的文本标题化。
示例(这些字符串连接为公司名称,其中包含标题和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();
});
}
有更好的建议吗?
答案 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;
}