2016-09-03 10 views
0

WindowsフォームでC++を使用して簡単な電卓を作成しています。一部には、画面上のラベルテキストを更新する必要があります...しかし、それはforexample ...ない:ラベルのテキストは、タイプキャストで0を追加した後にWindowsフォーム上で更新されません。C++

私は画面 334.5 に持っている私は、0ボタンをクリックして、それがラベル に更新されませんが、私は他のボタンをクリックすると、 8が、それはこの

334.508

のように更新し、私はDから型キャストだと言うことができますここ

コードの一部は、文字列およびその逆にoubleタイプ... ...

int totalLength = 0; 
bool decimalPressed = false; 
int decimalPart = 1; 
bool isNegative = false; 

void AddNewNum(double num){ 
    if (totalLength < 12){ 
     if (decimalPressed == false){ 
      if (isNegative == false){ 
       double prevDisplay = Convert::ToDouble(label1->Text); 
       prevDisplay = (prevDisplay * 10) + num; 
       label1->Text = Convert::ToString(prevDisplay); 
      } 
      else{ 
       double prevDisplay = -1 * Convert::ToDouble(label1->Text); 
       prevDisplay = (prevDisplay * 10) + num; 
       label1->Text = Convert::ToString(-1 * prevDisplay); 
      } 
     } 
     else{// for adding digits in decimal part in this section error occurs .. only problem is display everything is okay 
      if (isNegative == false){ 
       double prevDisplay = Convert::ToDouble(label1->Text); 
       if (num != 0) 
        prevDisplay = ((prevDisplay * (pow(10, decimalPart)) + num)/pow(10, decimalPart)); 
       else{ 
        prevDisplay = ((prevDisplay * (pow(10, decimalPart)))/pow(10, decimalPart)); 
       } 
       label1->Text = Convert::ToString(prevDisplay); 
      } 
      else{ 
       double prevDisplay = -1 * Convert::ToDouble(label1->Text); 
       prevDisplay = ((prevDisplay * (pow(10, decimalPart)) + num)/pow(10, decimalPart)); 
       if (num != 0) 
        prevDisplay = ((prevDisplay * (pow(10, decimalPart)) + num)/pow(10, decimalPart)); 
       else{ 
        prevDisplay = ((prevDisplay * (pow(10, decimalPart)))/pow(10, decimalPart)); 
       } 
       label1->Text = Convert::ToString(-1 * prevDisplay); 
      } 
      decimalPart++; 
     } 
     totalLength++; 
    } 
    else maskedTextBox1->Text = "LIMIT REACHED"; 
} 
+0

「decimalPart」の種類とはどのように計算されますか?完全な例を投稿してください。 – Franck

+0

それはint型です。 –

+1

私はこの "型キャスト"と呼ぶべきではありません。 – usr2564301

答えて

1

334.5334.50334.50000000000、これらはdoubleにすべて同じ番号です。 を末尾にゼロが付いたstringとしてフォーマットするときに表示する小数点以下の桁数を指定する必要があります。

数字を追加しているときは、doublestringの間では変換しないでください。代わりに、単純な文字列の連結を使用します。

label1->Text = label1->Text + Convert::ToString(num); 

は、実際の算術演算を実行するときにのみdoublestring間の変換、またはあなたはそれを割り当てる前に新しい文字列を検証したい場合は、例えば:

string s = label1->Text + Convert::ToString(num); 
Convert::ToDouble(s); // check for errors 
label1->Text = s; 

いずれかの方法を、すべてのdecimalPart値を手動で追跡する理由はありません。ユーザーが小数点を入力すると、それを検出することができるので、後の数字が入力されたときに.文字を挿入できます。

bool decimal = false; 

... 

// user enters decimal point... 
decimal = true; 

... 

// user enters a digit... 
string s = label1->Text; 
if (decimal) { 
    decimal = false; 
    s = s + "."; 
} 
s = s + Convert::ToString(num); 
Convert::ToDouble(s); // check for errors 
label1->Text = s; 
+0

ありがとうございました.. –

関連する問題