※当サイトの記事には、広告・プロモーションが含まれます。

MySQLでdecimal型を使う時に

decimal型とは

「パック無し浮動小数点」は、各桁の数値を1文字ずつ文字列として格納します。

浮動小数点(FLOAT型・DOUBLE型)では演算に誤差が生じる場合があるため、金額など正確な演算を行うには、パック無し浮動小数点(DECIMAL型・NUMERIC型)を使用します。

decimalの場合、桁数を(M,D)の形で指定します。

内訳は以下の通りです。

M…扱う少数の最大桁数

D…小数点以下の桁数

例えば、(10, 3)という桁数を指定したら、全体で最大10桁、小数点以下は3桁、という解釈になります。

仮に、itemというテーブル

カラム データ型 照合順序 属性 インデックス
その他
item_id int(10)   UNSIGNED primary_key
auto_increment
item_name text utf8_general_ci    
detail text utf8_general_ci    
price decimal(10,3)   UNSIGNED  
image varchar(50) utf8_general_ci    
ctg_id tinyint(3)   UNSIGNED  

があったとして、 

priceというカラム(データ型decimal(10,3)と設定していた場合)に、

商品データで価格が129.800円のものをSQL文で挿入するときは、

$sql = " INSERT INTO item ( "
          ." item_name, "
          ." detail, "
          ." price, "
          ." image, "
          ." ctg_id  "
          ." )VALUES( "
          ." 'jacket', "
          ." 'シックな中にもエレガンスを感じさせる、ロロピアーナならではの素晴らしい色合いです。', "
          ." 129.800, "
          ." 'jacket01.jpg', "
          ." 1 "
          ." )";

のようになります。

気をつけたいのは、decimal(10,3)という設定をした場合、挿入する値の小数点以下は『 . 』で区切るという点と、10桁に達しなくてもOK(最大10桁なので)という点です。

挿入する値を『 , 』で区切ると反映されないようです。

 

decimal型データの値のMySQLデータベースへの挿入例
OK NG
129.800 129,800

 

PHPで『 . 』の部分を『 , 』に切り替えて表示するには、number_format( )関数で可能です。

number_format

(PHP 4, PHP 5)

number_format数字を千位毎にグループ化してフォーマットする 

説明

string number_format ( float $number [, int $decimals = 0 ] )
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." ,string $thousands_sep = "," )

この関数は 1 つか 2 つもしくは 4 つのパラメータを受け取ります (3 つはありません) :

パラメータが 1 つだけ渡された場合、 number は千位毎にカンマ (",") が追加され、 小数なしでフォーマットされます。

パラメータが 2 つ渡された場合、numberdecimals 桁の小数の前にドット (".") 、 千位毎にカンマ (",") が追加されてフォーマットされます。

パラメータが 4 つ全て渡された場合、number はドット (".") の代わりに dec_pointdecimals 桁の小数の前に、千位毎にカンマ (",") の代わりに thousands_sep が追加されてフォーマットされます。 

パラメータ

number

フォーマットする数値。

decimals

小数点以下の桁数。

dec_point

小数点を表す区切り文字。

thousands_sep

千位毎の区切り文字。

返り値

number をフォーマットした結果を返します。 

変更履歴

バージョン 説明
5.4.0 この関数は、 dec_pointthousands_sep に複数バイトを指定できるようになりました。 それまでは、複数のバイトを指定しても先頭の 1 バイトしか使われませんでした。

第3引数を使う場合は、第4引数を使わないとしても、第4引数も記述しなければいけません。

第3引数を記述していて、第4引数を記述しないと、

『Wrong parameter count for number_format( ) in』というエラーが出ます。

例:数字の中のピリオドをコンマにする

$price = 129.800;

$new_price = ($price, 3, ",", ",");

 

⇩  詳しくは下記サイトへ

PHPで数字にカンマを付ける方法 | PHPの逆引きリファレンス

今回はこのへんで。