JSFiddle - React, Tailwind, and code Playground

by Matsunaga_Ajike

HTML

<p>数値を入力してください。</p>
<input type="text" id="js-numericValue" class="numeric-value" value="" />

CSS

.numeric-value {
	font: 20px sans-serif;
	padding: 12px;
	border: 1px solid #000000;
	border-radius: 3px;
}

JavaScript

$(function() {
    var priceCommaData    = '';
    var priceNonCommaData = '';

    /**
     * フォーカス
     */
    $('#js-numericValue').on('focus', function() {
        priceCommaData    = $(this).val(); // 入力値取得
        priceNonCommaData = removeComma(priceCommaData); // カンマ削除

        $(this).val(priceNonCommaData); // 反映
    });


    /**
     * フォーカスアウト
     */
    $('#js-numericValue').on('blur', function() {
        priceNonCommaData = $(this).val(); // 入力値取得
        priceCommaData    = addComma(priceNonCommaData); // カンマ付与

        $(this).val(priceCommaData); // 反映
    });


    /**
     * カンマの追加
     */
    function addComma(priceNonCommaData) {
        var priceCommaData = '';

        /**
         * 正規表現
         * \d        => 半角数字
         * \d{3}     => 3桁の半角数字
         * ?=(\d{3}) => \dの後ろに\d{3}がある
         * +(?!\d)   => \d{3}の後ろに\dがない
         * g         => マッチしたべての部分文字列を置換
         * $1        => 変数
         *           => カッコ()で囲われた部分を$1に代入
         * 
         * 1234の場合の$1 => 1
         * 1234の場合の$2 => 234
         * https://regexr.com/
         */   
        priceCommaData = priceNonCommaData.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');

        // 小数点以下のカンマを削除
        if (priceCommaData.search(/\./) !== -1) { // 小数点が含まれている場合
            priceCommaData = removeFloatComma(priceCommaData);
        }

        return priceCommaData;
    }

    /**
     * カンマの削除
     */
    function removeComma(priceCommaData) {
        var priceNonCommaData = '';
        priceNonCommaData = priceCommaData.replace(/,/g, ''); // 入力時のカンマを削除
        return priceNonCommaData;
    }

    /**
     * 小数点以下のカンマの削除
     */
    function removeFloatComma(priceCommaData) {
        var priceDotBefore = '';
        var priceDotAfter  = '';

        // 小数点までを取得
        priceDotBefore = priceCommaData.match(/(.*)\./);
        priceDotBefore = priceDotBefore[0];
        priceDotBefore = priceDotBefore.replace(/\./g, '')

        // 小数点以降を取得
        priceDotAfter =...