• ベストアンサー

80.25円の少数部分を取得したい

80.25円、106.83円、72.00円などの少数部分だけを取得する正規表現の作り方を教えてください。 $a=80.25; として取得しようとすると、小数点を示す「.」が任意の1文字を表す表現なので、どう作ったものか分からないでいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.7

>これは、後でくっつける方法でしょうか? >$1.".".$2 それは質問の仕方がわるいね。一言も「整数部分がいる」とはいわれてないし。 「少数部分だけを取得する」という命題であれば本来整数部分は 拾ってくるのは無駄です。必要十分な条件は#1になります。 <?PHP mb_internal_encoding("utf8"); $str="xxxx80.25円、106.83円、72.00円xxxx"; $pattern="/(?:[0-9]+\.)([0-9]+)(?=円)/u"; preg_match_all($pattern,$str,$matches); print_r($matches); ?> こうすれば$matches[0]にはヒットした箇所、$matches[1]には小数点以下が はいっていることがわかります

opuwx6vi
質問者

お礼

Array ( [0] => Array ( [0] => 80.25 [1] => 106.83 [2] => 72.00 ) [1] => Array ( [0] => 25 [1] => 83 [2] => 00 ) ) を確認しました。 おっしゃるように、言葉足らずでした。 整数部 小数点 小数部 から成り立っていますね。 正確に記するべきでした。

その他の回答 (7)

回答No.8

少数部を取得するなんて不可能だろう。 なぜなら・・・。

noname#147388
noname#147388
回答No.6

整数部も含めるなら 例: 文字列_:100.25円 正規表現:[^0-9.]*([0-9.]+)[^0-9.]* 結果取得:$1 ちなみに私が書いてある $1, $2 は変数ではなく正規表現式の置換結果に書くグループ表現です。

opuwx6vi
質問者

お礼

$a="100.25円"; if(mb_ereg("[^0-9.]*([0-9.]+)[^0-9.]*",$a,$result)){   echo $result[1]; } で、$resultに、100.25が入る事を確認しました。ありがとうございます。 ところで、上のif文は、 $result=mb_ereg("[^0-9.]*([0-9.]+)[^0-9.]*",$a) と書けないものでしょうか? この文では失敗しましたが。

noname#147388
noname#147388
回答No.5

余計な部分をカットした後に 正規表現を利用した置換を]用いればできますよ。 $1 : 整数部 $2 : 小数部

opuwx6vi
質問者

お礼

これは、後でくっつける方法でしょうか? $1.".".$2 という方法で。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

あれ? #2さんのってホントに「少数部分だけを取得する」ことできますか?

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

最終的にどういう形で取り出したいのでしょうか。あとの処理で使うときに数値がいいのか文字列がいいのかで変わってくるとは思います。 私なら、邪魔な「円」を先にカットしてあとは数値計算にしてしまいます。 <?php $val = '-80.75円'; print $val; print "<br>"; $str = trim(str_replace('円', '', $val)); print floatval($str) - intval($str); print "<br>"; print fmod(floatval($str), 1);

opuwx6vi
質問者

お礼

-80.75円 -0.75 -0.75 が返ってきました。 str_replaceを使った方法ですね。 試してみたところ、print floatval($val);と「円」のついたまま放り込んでも、-80.75が返ってきました。余りを計算して取り出す方法もあるのですね。

noname#147388
noname#147388
回答No.2

方法1:([0-9]+)[.]([0-9]+) 方法2:([0-9]+)\.([0-9]+) [.] と描くことで . を対称にする。 \. エスケープする。 かと #1のだと正常に取れない気がする。

opuwx6vi
質問者

お礼

方法1、2ともに、100が返ってきました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

文字列が前提なのでしょうか?円はかならずはいっている? UTF8で処理する場合 <?PHP mb_internal_encoding("utf8"); $str="xxxx80.25円、106.83円、72.00円xxxx"; $pattern="/(?<=[0-9]\.)[0-9]+(?=円)/u"; preg_match_all($pattern,$str,$matches); print_r($matches); ?>

関連するQ&A

専門家に質問してみよう