質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2507閲覧

php 正規表現のご質問

SugiuraY

総合スコア317

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/07/23 03:41

大変お世話になっております。
現在以下のような表現があります。

1489億円
3.6兆円
-2006億円

目的としては数値についてはカンマを打ち、単位を残したいと考えております。

まず、正規表現を使用し、単位を除外してか、number_formatでカンマを打ち
また同じ単位をつけてあげる作業をイメージしておりました。
ただし、単位も必ずしも同じではないので、単純に後付けで.strをすることでは
対応できず、正規表現で消してあげた元の単位を戻したいと考えております。

これらをうまく実行する術はございますでしょうか?
(もちろん、正規表現やnmber_formatを必ずしも使用したいわけではございません)

何卒、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/07/23 06:43

詳細なご回答をいただきありがとうございます。 number_formatで小数点が丸くなってしまうことを失念しておりました。 大変、勉強になります。こちらの方法で一度コードを書いていきたいと考えております。 改めて御礼申し上げます。
guest

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

MakeNowJust

総合スコア545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/07/23 06:40

ご回答をいただき、ありがとうございます。 ($m[1]) . $m[2])の意味、使い方を存じ上げないため、調べてみようと思います。 しかしながら、おっしゃるコードで確かに出力できることを確認いたしました。 御礼もうし上げます。
guest

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

mamamax

総合スコア75

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2016/07/23 06:31

ご回答を頂き、ありがとうございます。 お力添えに温冷もうし上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問