int::Parse(String^ n)のバイト制限 – プログラミング – Home

通知
すべてクリア

[解決済] int::Parse(String^ n)のバイト制限


Mr.Beginner
 Mr.Beginner
(@Mr.Beginner)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

下記のように16桁の数値変換し、カンマ区切り編集をしたいのですが、エラーが出てし
まいました。6桁はうまくいっていたのですが…。どうしたらいいでしょうか?

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

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

int じゃ収まらないので long にしましょう。
int に収まるのは 10 桁が限度です。


返信引用
Mr.Beginner
 Mr.Beginner
(@Mr.Beginner)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

aetosさん、早速の回答ありがとうございます。

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

上記のようにやってみたのですが、残念ながら同じ結果でした。

(質問の宣言部分が間違えてました。すみません。)


返信引用
Mr.Beginner
 Mr.Beginner
(@Mr.Beginner)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

doubleでやったらうまくいきました。

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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;
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>doubleだと%演算子とか使えなくなりますし。
結局文字列にするんでしたね。。。関係なかった(;^^)


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

あれ?
C++/CLI って long == Int64 じゃないんだっけ?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>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
 Mr.Beginner
(@Mr.Beginner)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

ほんとだ。

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

になってました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました