下記のように16桁の数値変換し、カンマ区切り編集をしたいのですが、エラーが出てし
まいました。6桁はうまくいっていたのですが…。どうしたらいいでしょうか?
String^ s = String::Format(1234567890123456);
String^ s = int::Parse(n).ToString(#,##0);
追加情報: Int32 型の値が大きすぎるか、または小さすぎます。
プログラム '[3672] FZXXinq.exe: マネージ' はコード -532459699 (0xe0434f4d) で終
了しました。
int じゃ収まらないので long にしましょう。
int に収まるのは 10 桁が限度です。
aetosさん、早速の回答ありがとうございます。
String^ n = String::Format(1234567890123456);
String^ s = long::Parse(n).ToString(#,##0);
上記のようにやってみたのですが、残念ながら同じ結果でした。
(質問の宣言部分が間違えてました。すみません。)
doubleでやったらうまくいきました。
String^ n = String::Format(1234567890123456);
String^ s = double::Parse(n).ToString(#,##0);
ありがとうございました。
System::Int64 のほうがよさげ。
doubleだと%演算子とか使えなくなりますし。
一応範囲が確認できるコード
using namespace System;
int main(array<System::String ^> ^args)
{
typedef unsigned int uint;
typedef unsigned long ulong;
Console::WriteLine(Lint {0}byte {1}~{2}, sizeof(int),
int::MaxValue, int::MinValue);
Console::WriteLine(Lunsigned int {0}byte {1}~{2}, sizeof(uint),
uint::MaxValue, uint::MinValue);
Console::WriteLine(Llong {0}byte {1}~{2}, sizeof(long),
long::MaxValue, long::MinValue);
Console::WriteLine(Lunsigned long {0}byte {1}~{2}, sizeof(ulong),
ulong::MaxValue, ulong::MinValue);
Console::WriteLine(Ldouble {0}byte {1}~{2}, sizeof(double),
double::MaxValue, double::MinValue);
Console::WriteLine(LInt32 {0}byte {1}~{2}, sizeof(Int32),
Int32::MaxValue, Int32::MinValue);
Console::WriteLine(LUInt32 {0}byte {1}~{2}, sizeof(UInt32),
UInt32::MaxValue, UInt32::MinValue);
Console::WriteLine(LInt64 {0}byte {1}~{2}, sizeof(Int64),
Int64::MaxValue, Int64::MinValue);
Console::WriteLine(LUInt64 {0}byte {1}~{2}, sizeof(UInt64),
UInt64::MaxValue, UInt64::MinValue);
return 0;
}
>doubleだと%演算子とか使えなくなりますし。
結局文字列にするんでしたね。。。関係なかった(;^^)
あれ?
C++/CLI って long == Int64 じゃないんだっけ?
int == long == Int32
long long == Int64
ですね。失礼しました。
しかし、
Console::WriteLine(long long::typeid->Name);
は「System.Int64」と出るのに
long long ll = long long::Parse(s);
はコンパイルエラーになります。なんか中途半端。
Int64::Parse を使うのがよさそうですね。
ところで、String::Format が無意味じゃないですか?
>doubleでやったらうまくいきました。
>
>String^ n = String::Format(1234567890123456);
>String^ s = double::Parse(n).ToString(#,##0);
これだと、
s = 1,234,567,890,123,460
になっちゃいます。最後2桁おかしくなりますね。。。
Int64 か Decimal が妥当かな。
ほんとだ。
>s = 1,234,567,890,123,460
になってました。
Int64にしたらうまくいきました。
ありがとうございました