【问题标题】:How can I tell if a javascript string is a number OR a date?如何判断 javascript 字符串是数字还是日期?
【发布时间】:2021-03-18 15:58:44
【问题描述】:

我有一个可能是字符串化日期或数字的值。我想以不同的方式处理每种情况。

日期值可以是任何可以被日期库解析的有效日期字符串,比如 dayjs。例如:"10/10/2020""10-20-2020"...

数字值可以是实际数字,也可以是字符串形式的数字,所以像5"5.3""10"这样的值...

例如->


      const number = parseFloat(value);
      if (!isNaN(number)) {
          return NumberValueConverter.prototype.toView(number);
      }

      const date = dayjs(value);
      if (date.isValid()) {
          return DateValueConverter.prototype.toView(value);
      }

此代码不起作用 - 因为日期字符串(例如 10-10-2020、10-10-2020)最终会被解析为 10

如果我反过来做,dayjs 会将 10 之类的数字转换为有效日期。

【问题讨论】:

  • 不要使用parseFloat,只使用isNaN(value)。它将返回转换是否产生有效数字。 isNaN("10-10-2020")true
  • 考虑到所有日期格式,这不一定是可能的。例如,20210318 是 ISO 8601 基本格式的有效日期表示。它也是一个有效的数字。 (2021-03-18 是 ISO 8601 扩展 日期格式。)
  • @MattJohnson-Pint 这很公平。我预计不会 100% 成功——这些是存储在 JSON 中的用户输入值——我主要是在寻找一种尽力而为的方法,该方法将返回一个相当有用的结果以在大部分时间显示给最终用户。

标签: javascript date parsing duck-typing


【解决方案1】:

parseFloat 在给定的字符串以数字开头时已经很高兴了,所以如果你在那个结果上测试isNaN,你会得到误报。

所以不要检查result是否为数字,而是original字符串是否代表数字:

if (!isNaN(number)) {

到:

if (!isNaN(value)) {

或者,您可以使用一元加号代替parseFloat,它只会在输入表示数字时返回一个确定的数字:

const number = +value;

...然后最好使用Number.isNaN 进行测试:

if (!Number.isNaN(number)) {

【讨论】:

    【解决方案2】:
    if(/^[0-9]+[.]{0,1}[0-9]*$/.test(value)) {
         // Handle your number value
    } else {
         // Check for date here
    }
    

    您可以使用上面的正则表达式来解析数字字符串。

    • /^ : 指开始你的字符串
    • $/ : 指字符串的结尾
    • [0-9]+ : 字符串的开头是从 0 到 9,长度最小为 1
    • [.]{0,1} : 可以包含 0 或最多 1 个 '.'
    • [0-9]* : 字符串末尾可以包含 0 到 9 位数字。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式来测试字符串在映射之前是否看起来像一个日期。 这个正则表达式来自https://www.regextester.com/96683 它会测试它是否看起来像您传入的日期。

      如果您事先不知道日期格式,可以使用更复杂的正则表达式来测试不同格式的日期:https://stackoverflow.com/a/15504877/14948219

       if(([12]\d{3}/(0[1-9]|1[0-2])/(0[1-9]|[12]\d|3[01])).test(value)){
          return date
       } else if(isNan(value){
          return number
          
       }
      

      【讨论】:

        猜你喜欢
        • 2021-06-22
        • 2010-09-09
        • 2013-01-11
        • 2012-03-16
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        相关资源
        最近更新 更多