- ベストアンサー
今度は全角が0.5で認識されてしまいます。
前回出来た!と思ったのですが、今度は「かな」「英字」「数字」ともに全角が0.5で認識されます。 どなたか直していただけませんか? 前回質問 http://oshiete1.goo.ne.jp/qa4613744.html
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
var strCount = Math.ceil(strLength(str).toString() /2 ); serLength の状態で、全角 1 半角 0.5 でカウントするようになっているので、改めて 2 で割らなくても大丈夫ですよ。 var strCount = Math.ceil(strLength(str)).toString(); =========================================================== #1 g は付け忘れです。すみません。 改行文字、タブ文字などは含んでもいいかもしれないですね。
その他の回答 (2)
- yuu_x
- ベストアンサー率52% (106/202)
重ねてすみません #2 訂正です。 「使用箇所によっては」改行文字、タブ文字なども含んでもいいかもしれないですね。文書内のテキストを扱うだけでしたら、 [\u0020-\u007E\uFF61-\uFF9F] の範囲で十分です。 ヌル文字や、制御文字なんかが来たら、TypeError を投げたほうが良いと思います。 charCodeAt もアイデアとしては良いんですが、これも残念ながら Unicode で取得できることは保障されていません。
お礼
今回お答え下さったプロの方ってやっぱり謎な頭脳を持ってるなぁと感動しました。実は皆様にお答え下さった文章の約2割程度しか理解出来なかったのですが皆様のおかげで当初の目標を達成できました★ 今後、ことあるごとに読み返し少しずつ吸収できればと思います。 どちらの方の意見が一番良かったのか実は知識がなさ過ぎてわからないのですが実際こんな知識の自分に都合が良かった回答を選ばせて頂きました。 この度は大変ご迷惑をおかけしてしまいましたが皆様の暖かいご回答に感謝いたします。 ありがとうございました!!
- Werner
- ベストアンサー率53% (395/735)
使ってるのは前回質問のNo.7のコードですか? その辺はちゃんと書いてください。 > 今度は「かな」「英字」「数字」ともに全角が0.5で認識されます。 私の方では、そんな現象は起こらなかった("あああ"→3、"aaa"→2.5でした)です。 > var matches = str.match(/[\u0020-\u007E\uFF61-\uFF9F]/) || []; ここの正規表現でgオプションが付いていないので 1文字目しか判別できていないのでしょう。(うっかり忘れたのだと思いますが。) 以下のように書いてみては。 //字下げに使ってる全角空白は消してください。 function strLength(str){ var matches = str.match(/[\u0020-\u007E\uF8F0-\uF8F3\uFF61-\uFF9F]/g) || []; return str.length - matches.length / 2; } なお、私ならこんな風に書きます。(動作は同じ。) function strLength(str) { var len = 0; for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); //半角と言われるコードポイント範囲 if ( (0x00<=c && c<=0x7e) || (0xf8f0<=c && c<=0xf8f3) || (0xff61<=c && c<=0xff9f)) { len += 0.5; } else { len += 1; } } return len; } 前回のNo.5のお礼で > どこかこのような物を公開しているところなんてないんですかね? といってたけど、それは回答文中に載せてました。 バイト数をカウントする物だけど2で割れば求めている結果になるはず。
お礼
●この度もお忙しい中ありがとうございます! 使ってるのは前回質問のNo.7のコードですか? その辺はちゃんと書いてください。 ●はい、No7のコードです。半角が0.5と認識されて感動したのですが全角も0.5という事に気がつきました。 > 今度は「かな」「英字」「数字」ともに全角が0.5で認識されます。 私の方では、そんな現象は起こらなかった("あああ"→3、"aaa"→2.5でした)です。 ●こちらでは「あいうえお」→3と表示されるのですが、、、これを5と表示させたいです。 > var matches = str.match(/[\u0020-\u007E\uFF61-\uFF9F]/) || []; ここの正規表現でgオプションが付いていないので 1文字目しか判別できていないのでしょう。(うっかり忘れたのだと思いますが。) 以下のように書いてみては。 //字下げに使ってる全角空白は消してください。 function strLength(str){ var matches = str.match(/[\u0020-\u007E\uF8F0-\uF8F3\uFF61-\uFF9F]/g) || []; return str.length - matches.length / 2; } なお、私ならこんな風に書きます。(動作は同じ。) function strLength(str) { var len = 0; for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); //半角と言われるコードポイント範囲 if ( (0x00<=c && c<=0x7e) || (0xf8f0<=c && c<=0xf8f3) || (0xff61<=c && c<=0xff9f)) { len += 0.5; } else { len += 1; } } return len; } ●たくさんありがとうございます!でもどちらも期待通り動きませんでしたがそのままアップロードじゃやっぱまずいのでしょうか。ちなみに//以下の日本語は消去しました。その他、変えてません。 前回のNo.5のお礼で > どこかこのような物を公開しているところなんてないんですかね? といってたけど、それは回答文中に載せてました。 バイト数をカウントする物だけど2で割れば求めている結果になるはず。 ●どこをカスタマイズすればいいのかわかりませんでした。そのままアップロードして動かなくてあきらめました。ご面倒おかけしてすみません。
お礼
前回、お教えいただいた物を上記のとおりに変更し、更にはgを付け加え、めでたく今度こそ完成してしまいました。 うれしいです! スペシャルサンクスフォーエバーです!