int::Parse(String^ n)のバイト制限

[戻る]
Mr.Beginner 2010/01/26(火) 15:55:04
下記のように16桁の数値変換し、カンマ区切り編集をしたいのですが、エラーが出てし
まいました。6桁はうまくいっていたのですが…。どうしたらいいでしょうか?

String^ s = String::Format("1234567890123456");
String^ s = int::Parse(n).ToString("#,##0");

"追加情報: Int32 型の値が大きすぎるか、または小さすぎます。
プログラム '[3672] FZXXinq.exe: マネージ' はコード -532459699 (0xe0434f4d) で終
了しました。"

aetos 2010/01/26(火) 15:58:23
int じゃ収まらないので long にしましょう。
int に収まるのは 10 桁が限度です。

Mr.Beginner 2010/01/26(火) 16:16:54
aetosさん、早速の回答ありがとうございます。

String^ n = String::Format("1234567890123456");
String^ s = long::Parse(n).ToString("#,##0");


上記のようにやってみたのですが、残念ながら同じ結果でした。
 
(質問の宣言部分が間違えてました。すみません。)

Mr.Beginner 2010/01/26(火) 16:25:02
[[解決]]
doubleでやったらうまくいきました。

String^ n = String::Format("1234567890123456");
String^ s = double::Parse(n).ToString("#,##0");

ありがとうございました。

Blue 2010/01/26(火) 16:53:24
System::Int64 のほうがよさげ。
doubleだと%演算子とか使えなくなりますし。


一応範囲が確認できるコード

using namespace System;

int main(array<System::String ^> ^args)
{
    typedef unsigned int uint;
    typedef unsigned long ulong;

    Console::WriteLine(L"int           {0}byte  {1}〜{2}", sizeof(int),   
int::MaxValue,    int::MinValue);
    Console::WriteLine(L"unsigned int  {0}byte  {1}〜{2}", sizeof(uint),  
uint::MaxValue,   uint::MinValue);
    Console::WriteLine(L"long          {0}byte  {1}〜{2}", sizeof(long),  
long::MaxValue,   long::MinValue);
    Console::WriteLine(L"unsigned long {0}byte  {1}〜{2}", sizeof(ulong), 
ulong::MaxValue,  ulong::MinValue);
    Console::WriteLine(L"double        {0}byte  {1}〜{2}", sizeof(double),
double::MaxValue, double::MinValue);
    Console::WriteLine(L"Int32         {0}byte  {1}〜{2}", sizeof(Int32), 
Int32::MaxValue,  Int32::MinValue);
    Console::WriteLine(L"UInt32        {0}byte  {1}〜{2}", sizeof(UInt32),
UInt32::MaxValue, UInt32::MinValue);
    Console::WriteLine(L"Int64         {0}byte  {1}〜{2}", sizeof(Int64), 
Int64::MaxValue,  Int64::MinValue);
    Console::WriteLine(L"UInt64        {0}byte  {1}〜{2}", sizeof(UInt64),
UInt64::MaxValue, UInt64::MinValue);
    return 0;
}

Blue 2010/01/26(火) 16:54:37
>doubleだと%演算子とか使えなくなりますし。
結局文字列にするんでしたね。。。関係なかった(;^^)

aetos 2010/01/26(火) 19:32:29
あれ?
C++/CLI って long == Int64 じゃないんだっけ?

aetos 2010/01/26(火) 19:42:31
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 が無意味じゃないですか?

subaru 2010/01/27(水) 10:57:20
>doubleでやったらうまくいきました。
>
>String^ n = String::Format("1234567890123456");
>String^ s = double::Parse(n).ToString("#,##0");

これだと、
s = "1,234,567,890,123,460"
になっちゃいます。最後2桁おかしくなりますね。。。
Int64 か Decimal が妥当かな。

Mr.Beginner 2010/01/27(水) 14:32:39
ほんとだ。

>s = "1,234,567,890,123,460"

になってました。

Int64にしたらうまくいきました。
ありがとうございました

古いスレッドには追加発言できません。