🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

12482閲覧

C#でdouble値を有効桁数4桁の文字列に変換したい

pinepine

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/10 03:20

C#でdouble値を有効桁数4桁の文字列に変換したいのですが、ToString("G4")を使って変換すると、後ろに続く「0」が省略されてしまい、有効桁数4桁の表現としては正しくない場合があります。

CやC++で、printf("%.4G",...)を使っても同じ結果なのですが、printf("%#.4G",...)とすると正しく変換されます。

C#にこれに該当するオプションはないのでしょうか?

発生している問題

C#

1double value = 0.0012997; 2value.ToString("G4");

上記コードでは、「0.001300」となるべきところが、「0.0013」と出力されます。

試したこと

C++

1double value = 0.0012997; 2CString str; 3str.Format("%.4G", value); // "0.0013"と出力される。 4str.Format("%#.4G", value); // "0.001300"と出力される。

C#にも同じオブションがあると良いのですが、ToStringの仕様を何度読んでも見つかりませんでした。
もし自前で作る必要があるようでしたら、どこかにサンプルがあれば教えていただけると有り難いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

とりあえず適当に書いてみたら 0.001300 と表示されたけど…ダメなパターンあるかも?

//末尾に'0'を付ける作業用 static string MyAddZero( string S ) { //愚直に引数文字列の先頭から見ていって,桁が足りない様なら末尾に'0'を付与する int nAddZero = 4; //末尾に何個'0'を加えれば良いか bool NonZeroFound = false; bool DotFound = false; foreach( char C in S ) { if( C=='.' ){ DotFound = true; } else if( '1'<=C && C<='9' ){ --nAddZero; NonZeroFound=true; } else if( NonZeroFound && C=='0' ){ --nAddZero; } if( nAddZero<=0 )return S; } if( !DotFound ){ S += '.'; } return S + new string( '0', nAddZero ); } //valを有効桁数4桁の文字列にする static string MyG4( double val ) { var S = val.ToString( "G4" ); int iE = S.IndexOf( 'E' ); return ( iE<0 ? MyAddZero( S ) : MyAddZero( S.Substring(0,iE) ) + S.Substring(iE) ); } // static void Main(string[] args) { Console.WriteLine( MyG4( 0.0012997 ) ); }

投稿2019/09/10 05:10

fana

総合スコア11985

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

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

pinepine

2019/09/11 00:39

回答ありがとうございます。 自作のテストプログラムに、fanaさんに作っていただいたコードを組み込んで試してみました。 まだテストパターンは少ないですが、今のところバッチリ動作しています。 指数表記に切り替わっても、ちゃんと有効桁数が4桁になっています。 こんな短時間でパパッと作れてしまうなんて凄いです。 MSの仕様がおかしいと思うので、オプションがあるんだと思っていましたが、やはり存在しないのですね。 もう少しテストパターンを増やしてみて、質問がなければベストアンサーにさせていただきたいと思います。 ありがとうございます。
fana

2019/09/11 01:13

ダメなパターンが見つかった場合には教えて頂けると助かります.
pinepine

2019/09/13 01:22

回答が遅くなり申し訳ありません。 追加したテストでも正しく動作していて、問題は見つかりませんでした。 コードを拝見すると、やっている事は愚直ですが、コードがコンパクトにまとまっていてステキです。 私が作るとコードも愚直になって、3倍位に増えそうです。 「高評価」をもっと付けたいところですが、+1しか出来ないようです。 ベストアンサーとさせていただきます。 ありがとうございました。
guest

0

value.ToString("G4");の書き方だと、小数点以下4桁まで表示という意味になります。

代替案として、指数表示ではいかがでしょうか?
value.ToString("E3");と記述した場合、実数部1桁と小数点以下3桁の合計4桁表示で、1.300E-003の文字列が返ってきます。

書式を指定して数値を文字列に変換する

投稿2019/09/10 03:46

takapi_cs

総合スコア349

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

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

pinepine

2019/09/10 03:55

回答ありがとうございます。 例えば、value = 0.0012993の場合、ToString("G4")は、「0.001299」を返します。 四捨五入を5桁目でしてくれるは良いのですが、後ろに続く「0]を省略されてしまうと、数値の意味が変わってしまいます。 また、ご提案いただいた指数表記ですが、C++からの移植なので、出来れば同じ仕様にしたいと考えています。
guest

0

"." カスタム指定子 を使ってください。

value.ToString("0.0000", CultureInfo.InvariantCulture));

追記

質問を読み間違えていたようです。四桁にしたいというタイトルだと思いました。

投稿2019/09/10 03:35

編集2019/09/10 03:42
Zuishin

総合スコア28669

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

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

pinepine

2019/09/10 03:49

回答ありがとうございます。 有効桁数4桁なのでややこしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問