如何判断 javascript 字符串是数字还是日期?

问题描述

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

日期值可以是任何可以被日期库解析的有效日期字符串,例如 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,您将得到误报。

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

if (!isNaN(number)) {

到:

if (!isNaN(value)) {

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

const number = +value;

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

if (!Number.isNaN(number)) {
,
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 位数字。
,

您可以在映射之前使用正则表达式来测试字符串是否像日期。 此正则表达式来自 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
    
 }