主な対象文字: −(U+2212, 数学記号のマイナス) ―(U+2015, 水平線) ー(U+30FC, 長音符) –(U+2013, エンダッシュ) —(U+2014, エムダッシュ) ➖(U+2796, Heavy Minus Sign) ﹣(U+FE63, Small Minus Sign) -(U+FF0D, 全角ハイフン) ﹘(U+FE58, Small Em Dash)
許可文字以外を削除
対象文字以外はすべて削除
許可文字以外を削除
対象文字以外はすべて削除
小数点整理
最初の1つだけ残す
2つ目以降は削除
マイナス整理
先頭の1つだけ残す
それ以外は削除
0補完
. で始まる場合 → 0. を付与
-. で始まる場合 → -0. を付与
空の扱い
空欄や入力途中は null
実装例(Vue対応)
function normalizeNumber(input) {
let s = input ?? "";
// 0. 全角 → 半角(数字・記号)
s = s.replace(/[0-9]/g, (c) =>
String.fromCharCode(c.charCodeAt(0) - 0xfee0)
);
s = s.replace(/./g, ".");
// 1. マイナス記号の統一
s = s.replace(/[−―ー–—➖﹣-﹘]/g, "-");
// 2. 許可文字以外を削除
s = s.replace(/[^0-9.\-]/g, "");
// 3. 小数点は最初の1つだけ
const dot = s.indexOf(".");
if (dot !== -1) {
s = s.slice(0, dot + 1) + s.slice(dot + 1).replace(/\./g, "");
}
// 4. マイナスは先頭1つだけ
s = s.replace(/(?!^)-/g, "");
// 5. 0補完(オプション)
if (s.startsWith("-.")) s = "-0." + s.slice(2);
else if (s.startsWith(".")) s = "0" + s;
// 6. 空の扱い
if (!/[0-9]/.test(s)) return null;
return s;
}
コメント