【问题标题】:Javascript compare numbers as stringsJavascript将数字作为字符串进行比较
【发布时间】:2019-07-11 11:57:20
【问题描述】:

我希望在 javascript 中比较两个字符串。我正在使用 localeCompare 方法,但输出不符合预期

116457 < 3085
false

"116457" < "3085"
true

"116457".localeCompare("3085")
-1

第二种和第三种情况的输出不符合预期。

我知道它按字典顺序排序,但我仍然无法理解为什么会这样以及我应该如何克服这个问题。

任何帮助将不胜感激。

【问题讨论】:

  • "1""3" 之前,因此任何以"1" 开头的字符串都在以"3" 开头的任何其他字符串之前。你说你知道这一点,但很难理解为什么。你同意"a" &lt; "c"吗?
  • 那些字符串总是整数?如果是,为什么不使用parseInt(str) 投射它?
  • 其实没有。在我正在处理的场景中,它们并不总是整数
  • 关于“我应该如何克服这个问题”:如果您需要解决方案的建议,您必须更具体地了解要求。你的输入有什么模式,你希望它们如何排序?你说“c-3085”可以发生; "a-5" 和 "b-1" 和 "a-b+7-c+1" 也可以出现,应该如何排序?
  • 感谢大家的帮助。我将编写自己的函数!

标签: javascript string-comparison


【解决方案1】:

如果你想比较它们而不将它们转换为数字,你可以在options参数中设置numeric: true

console.log(
  "116457".localeCompare("3085", undefined, { numeric: true })
)
console.log(
  "116457".localeCompare("3085")
)

【讨论】:

    【解决方案2】:

    如果 116457 是一个词,那么在字典中它会出现在 3085 之前。

    考虑一个字典

    • “applicative”(以“a”开头的长单词,c.f.以“1”开头的长数字字符串)
    • “copy”(以“c”开头的短单词,c.f.以“3”开头的较短数字字符串)。

    【讨论】:

    • 好的。有道理。
    • 但是我该如何克服呢? (我不想把它转换成数字)
    • 将其转换为数字? “我不想”……为什么?
    • 在我正在处理的场景中,我基本上“不能”使用 parseInt(str) 或 Number(str) 转换它,它并不总是得到整数。在某些情况下我也会得到字符串。示例:“c-116457”和“c-3085”
    • 好吧,如果您有复杂的字符串,其中各种子字符串具有特定的含义,那么您必须编写自己的比较器函数来考虑所有这些。以不同的方式表示您的数据可能更有效,例如作为具有一堆属性的对象而不是字符串。
    猜你喜欢
    • 2016-04-17
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多