大変お世話になっております。
現在以下のような表現があります。
1489億円
3.6兆円
-2006億円
目的としては数値についてはカンマを打ち、単位を残したいと考えております。
まず、正規表現を使用し、単位を除外してか、number_formatでカンマを打ち
また同じ単位をつけてあげる作業をイメージしておりました。
ただし、単位も必ずしも同じではないので、単純に後付けで.strをすることでは
対応できず、正規表現で消してあげた元の単位を戻したいと考えております。
これらをうまく実行する術はございますでしょうか?
(もちろん、正規表現やnmber_formatを必ずしも使用したいわけではございません)
何卒、よろしくお願い申し上げます。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
私の場合は下記のようにします。
方法はSugiuraYさんのおっしゃる通り数値と単位に分けて、数値にnumber_formatでカンマを付けています。
小数点以下は、
・number_format()は小数を丸めてしまう
・小数点以下はいくつあるか決まっておらず、またゼロが入る場合と入らない場合がある(例:3.6億円、3.60億円、3.600億円)
ということから、小数点で分割してその前後に分けて処理しています。
出力は単位以外は半角に変換しています。変換対象は、数値・符号・小数点です。
**先頭のプラス(+)とマイナス(-)**をそのまま残しています。
オーバーフローは文字列で扱うため気にする必要はないです。
PHP
1// テスト用 2$prices = ['1489億円', '+1489億円', '-1489億円', '3.6兆円', '+3.6兆円', '-3.6兆円', '3.60兆円', '+3.60兆円', '-3.60兆円', '1234万円', '+1234万円', '-1234万円', '1234.5万円', '+1234.5万円', '-1234.5万円', '+1234.5万円', '-1234.5万円', 'abc1234億円', '123456789123456789123456789123456789123456789123456789123456789123456798億万円']; 3 4foreach ($prices as $price) { 5 $price_original = $price; 6 7 $price = mb_convert_kana($price, 'n'); 8 $price = str_replace(".", ".", $price); 9 $price = str_replace("+", "+", $price); 10 $price = str_replace("-", "-", $price); 11 12 preg_match('/^([+-]?)([0-9.+-]+)([^0-9.]*)$/', $price, $matches); 13 14 if (array_key_exists(1,$matches) && array_key_exists(2,$matches) && array_key_exists(3,$matches)) { 15 $i_d = explode(".", $matches[2]); 16 $output = array_key_exists(1,$i_d) ? $matches[1].number_format($i_d[0]).'.'.$i_d[1].$matches[3] : $matches[1].number_format($matches[2]).$matches[3]; 17 echo $price_original." → ".$output."<br>"; 18 } else { 19 echo $price_original." → ".$price."<br>"; 20 } 21} 22 23// 出力 241489億円 → 1,489億円 25+1489億円 → +1,489億円 26-1489億円 → -1,489億円 273.6兆円 → 3.6兆円 28+3.6兆円 → +3.6兆円 29-3.6兆円 → -3.6兆円 303.60兆円 → 3.60兆円 31+3.60兆円 → +3.60兆円 32-3.60兆円 → -3.60兆円 331234万円 → 1,234万円 34+1234万円 → +1,234万円 35-1234万円 → -1,234万円 361234.5万円 → 1,234.5万円 37+1234.5万円 → +1,234.5万円 38-1234.5万円 → -1,234.5万円 39+1234.5万円 → +1,234.5万円 40-1234.5万円 → -1,234.5万円 41abc1234億円 → abc1234億円 42123456789123456789123456789123456789123456789123456789123456789123456798億万円 → 123,456,789,123,456,778,016,321,140,220,543,605,260,105,579,046,985,566,055,088,240,214,409,216億万円
投稿2016/07/23 06:03
編集2016/07/23 06:47総合スコア1409
0
こういう感じでどうでしょうか。
php
1<?php 2$str = "-1489億円"; 3preg_match('/\A([-+]?[0-9]+)(.*)\z/', $str, $m); 4echo number_format($m[1]) . $m[2]; //=> -1,489億円
投稿2016/07/23 04:51
総合スコア545
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
<?php echo preg_replace_callback("/^(\-?[\d]+)/", "replace_number_format", "1489億円") . "\n"; echo preg_replace_callback("/^(\-?[\d]+)/", "replace_number_format", "3.6兆円") . "\n"; echo preg_replace_callback("/^(\-?[\d]+)/", "replace_number_format", "-2006億円") . "\n"; echo preg_replace_callback("/^(\-?[\d]+)/", "replace_number_format", "-12341234.12356㍑") . "\n"; function replace_number_format($matches) { return number_format($matches[1]); }
単純に質問内容の文字列だと自分ならこうするかなというので
文章中から抜き出すとなると動作しません。
また、小数点以下はカンマつけない、数値の前にある記号は-のみ対応するコードです。
でも、もっとうまいこと書ける気がします。
投稿2016/07/23 04:50
総合スコア75
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 06:43