C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#での文字数制限について。(期限が近く、急いでいます!)


(過去ログ 144 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■84454 / inTopicNo.1)  C#での文字数制限について。(期限が近く、急いでいます!)
  
□投稿者/ ひかり (1回)-(2017/07/06(Thu) 10:09:51)

分類:[C#] 

2017/07/06(Thu) 10:16:20 編集(投稿者)
はじめまして。ひかりといいます。
Visual Studio、C#を学び始めて1週間ほどの初心者です。

現在、Visual StudioでC#を使って「電卓」を作っています。
期限が今日の17時と差し迫っています。
どなたか、お力をお貸しください…。

ディスプレイに入力される文字数に10桁の文字数制限をかけたいです。
デザインのプロパティから「MaxLength」の数値を変更したところ、
ディスプレイにキーボードから入力される場合の文字数制限はかかりました。
ですが、数字ボタンを押しで入力される文字数に関しては制限がかかりませんでした。

形としては、ボタンを押した入力に文字数制限をかけて、
計算結果の桁数が11桁以上になる場合はディスプレイに答えの代わりに「E」と表示されるようにしたいです。

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


※数字ボタンを「btnNumber」、入力された文字や計算結果の表示されるディスプレイを
 「txtDisplay」(テキストボックス)と名前付けしています。


以下、現在のソースコードです。
―――――――――――――――――――――――――――――――――――――――――――――――――――――――

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Cal
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //boolでisFirstを代入。
        bool isFirst = true;
        //decimalで値1を代入。
        decimal 値1 = 0;

        private void btnNumber_Click(object sender, EventArgs e)
        {
            if (isFirst)
            {
                txtDisplay.Text = "";
                isFirst = false;
            }
            String text = txtDisplay.Text + ((Button)sender).Text;
            //文字列を数字に。
            decimal d = Convert.ToDecimal(text);
            //数字を文字列に。(先頭の“0”が消える)
            String text2 = d.ToString();
            txtDisplay.Text = text2;
        }

        //クリア。
        private void btnC_Click(object sender, EventArgs e)
        {
            演算 = 四則演算の記号.未定義;
            txtDisplay.Text = "0";
            値1 = 0;
            isFirst = true;
        }

        //小数点。
        private void btnDot_Click(object sender, EventArgs e)
        {
            //四則演算の記号を押された直後の . にも対応。(0. と続くようになる)
            if (isFirst)
            {
                txtDisplay.Text = "0";
                isFirst = false;
            }
            //小数点の重複チェック。
            if (txtDisplay.Text.IndexOf(".") >= 0)
            {
                //既に小数点がある。
                return;
            }
            txtDisplay.Text = txtDisplay.Text + ".";
            isFirst = false;
        }

        //“enum”で名前を付ける。
        enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
        四則演算の記号 演算 = 四則演算の記号.未定義;

        //足し算。
        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.ADD;
        }

        //引き算。
        private void btnSub_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.SUB;
        }

        //掛け算。
        private void btnMul_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.MUL;
        }

        //割り算。
        private void btnDiv_Click(object sender, EventArgs e)
        {
            if (!isFirst) calc();
            演算 = 四則演算の記号.DIV;
        }

        //イコール。
        private void btnEqu_Click(object sender, EventArgs e)
        {
            calc();
        }

        //イコールを複数回続けて押したときのために、もともとの数値(それまでの計算の答え)を tmp に保管しておく。
        decimal tmp;
        private void calc()
        {
            decimal 値2;
            if (isFirst)
            {
                値2 = tmp;
            }
            else
            {
                値2 = Convert.ToDecimal(txtDisplay.Text);
                tmp = 値2;
            }

            switch (演算)
            {
                case 四則演算の記号.ADD:
                    値1 += 値2;
                    break;
                case 四則演算の記号.SUB:
                    値1 -= 値2;
                    break;
                case 四則演算の記号.MUL:
                    値1 *= 値2;
                    break;
                case 四則演算の記号.DIV:
                    値1 /= 値2;
                    break;
                default:
                    値1 = 値2;
                    break;
            }

            txtDisplay.Text = 値1.ToString();
            isFirst = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //テキストボックスを使用したtxtDisplayを読み取り専用にする。
            this.txtDisplay.ReadOnly = true;
        }

        private void txtDisplay_TextChanged(object sender, EventArgs e)
        {
            if (isFirst)
            {

            }
        }

    }
}

引用返信 編集キー/
■84455 / inTopicNo.2)  Re[1]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ 魔界の仮面弁士 (1334回)-(2017/07/06(Thu) 10:34:12)
No84454 (ひかり さん) に返信
> 期限が今日の17時と差し迫っています。
講師が居るのなら、余裕を持ってそちらに尋ねるのが本筋かと思いますよ。
締め切りがあるなら尚の事。

分からないところを質問してもらわなければ、
講師としても指導しにくいでしょうし、学ぶ方としても、
不明点をまとめて問い合わせる能力も必要なスキルです。


> ディスプレイにキーボードから入力される場合の文字数制限はかかりました。
> ですが、数字ボタンを押しで入力される文字数に関しては制限がかかりませんでした。
btnNumber_Click の処理において、
 「文字数上限に達したときは、ボタン押下時の処理を行わない」
という処理を用意すれば良いと思います。

if(txtDisplay.TextLength == 10)
{
 return;
}

ただし、小数点や負数が含まれる場合の桁数の扱いも
考えておかねばならないでしょう。
たとえば、以下はいずれも「10桁」になります。


1234567890
7890.12345
-987.65432



> 計算結果の桁数が11桁以上になる場合はディスプレイに答えの代わりに「E」と表示されるようにしたいです。

小数点以下の桁数については、どのように考えておられますか?

現状は値の表示に
  txtDisplay.Text = 値1.ToString();
を使っているようですが、たとえば、
 値1 = Convert.ToDecimal("12.00");
 値1 = Convert.ToDecimal("12.0000");
とあった場合、有効桁数は異なりますが値としては同じですよね。
しかし前者は "12.00" の 5 桁、後者は "12.0000" の 7 桁が出力されることになります。
引用返信 編集キー/
■84456 / inTopicNo.3)  Re[1]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ shu (1032回)-(2017/07/06(Thu) 10:44:33)
No84454 (ひかり さん) に返信

ボタンをクリックしたときにテキストボックスに
設定する文字列の長さをチェックすればよいです。
引用返信 編集キー/
■84457 / inTopicNo.4)  Re[2]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ 774RR (537回)-(2017/07/06(Thu) 11:13:17)
この辺の人っすね
http://dixq.net/forum/viewtopic.php?f=3&t=19343

ちなみに 1/3 = 0.33333333333333333 と無限に続くわけですがエラーにしちゃっていいの?

引用返信 編集キー/
■84458 / inTopicNo.5)  Re[2]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (2回)-(2017/07/06(Thu) 11:14:08)
No84455 (魔界の仮面弁士 さん) に返信
>>期限が今日の17時と差し迫っています。
> 講師が居るのなら、余裕を持ってそちらに尋ねるのが本筋かと思いますよ。
> 締め切りがあるなら尚の事。
おっしゃるとおりです。
ですが、ここ数日講師が捕まらず……。

> if(txtDisplay.TextLength == 10)
> {
>  return;
> }
こちらを使わせていただいたところ、たしかに「 . 」が1桁として処理されていました。
できれば、「 . 」を1桁としてカウントしないプログラムにしたいです。
また、最初に10桁になるよう数字ボタンを押して、「+」などの演算記号を押したところ、
続いて押した数字ボタンが画面上には反映されませんでした。(計算結果は正しく表示されます)
こちらも「 . 」の処理を修正できれば解消される問題なのでしょうか?

> 小数点以下の桁数については、どのように考えておられますか?
小数点以下は、10桁に収まるよう切り捨てたいと思っております。
引用返信 編集キー/
■84459 / inTopicNo.6)  Re[2]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (3回)-(2017/07/06(Thu) 11:38:10)
No84456 (shu さん) に返信
> ボタンをクリックしたときにテキストボックスに
> 設定する文字列の長さをチェックすればよいです。
ありがとうございます。
引用返信 編集キー/
■84460 / inTopicNo.7)  Re[3]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (4回)-(2017/07/06(Thu) 11:39:25)
No84457 (774RR さん) に返信
> ちなみに 1/3 = 0.33333333333333333 と無限に続くわけですがエラーにしちゃっていいの?
ありがとうございます。
説明不足でした。
小数点以下の桁数オーバー分は、切り捨て処理をしたいと考えております。
引用返信 編集キー/
■84461 / inTopicNo.8)  Re[3]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ 魔界の仮面弁士 (1335回)-(2017/07/06(Thu) 11:58:02)
No84454 (ひかり さん) に返信
> デザインのプロパティから「MaxLength」の数値を変更したところ、

ユーザーからの直接入力が無い場合、MaxLength プロパティの設定は意味がありません。


> 計算結果の桁数が11桁以上になる場合はディスプレイに答えの代わりに「E」と表示されるようにしたいです。

E が表示された後で、btnC 以外が押された場合の対処もお忘れなく。



No84458 (ひかり さん) に返信
> こちらを使わせていただいたところ、たしかに「 . 」が1桁として処理されていました。
> できれば、「 . 」を1桁としてカウントしないプログラムにしたいです。

"." が含まれているかどうか調べる方法は、御自身で既に btnDot_Click で
書かれていますので、それを使えば良いと思います。
マイナスも対処するのであれば同様に。

あるいは txtDisplay.TextLength や txtDisplay.Text.Length の代わりに、
txtDisplay.Text.Replace(".", "").Length を使うという手もあります。


また、(txtDisplay の桁数ではなく)計算結果の桁数を 10 桁制限にするのなら、
> txtDisplay.Text = 値1.ToString();
の部分を
> String text2 = d.ToString();
> txtDisplay.Text = text2;
と同様に、一旦変数に受け取って、text2.Length などで長さ判定をすれば良いかと思います。
ただし小数点以下の扱いには御注意を。


> また、最初に10桁になるよう数字ボタンを押して、「+」などの演算記号を押したところ、
> 続いて押した数字ボタンが画面上には反映されませんでした。(計算結果は正しく表示されます)
isFirst が false で無い時にまで、『if(txtDisplay.TextLength == 10) return;』を
呼び出すようにしてしまったということは無いですか?
うーん。でもそれだと計算結果は正しくならないはずですし…。


>> 小数点以下の桁数については、どのように考えておられますか?
> 小数点以下は、10桁に収まるよう切り捨てたいと思っております。
整数部の桁数を求めて、それが 10 桁を超えていたら "E" 表記。
10 桁以下なら、「10 - 正数数部桁数」が 小数部の桁数なので、
それを Math.Round メソッドに指定するというのはどうでしょう。
引用返信 編集キー/
■84464 / inTopicNo.9)  Re[4]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (5回)-(2017/07/06(Thu) 14:41:12)
No84461 (魔界の仮面弁士 さん) に返信
> E が表示された後で、btnC 以外が押された場合の対処もお忘れなく。
ありがとうございます。
E 表示後のボタン押下対策、気づいておりませんでした。

10桁制限、かけられました。
>>また、最初に10桁になるよう数字ボタンを押して、「+」などの演算記号を押したところ、
>>続いて押した数字ボタンが画面上には反映されませんでした。(計算結果は正しく表示されます)
すみません。
ソースコードを書き込む場所が間違っていたようです。
何度か場所を変えたら、解決しました。

> >> 小数点以下の桁数については、どのように考えておられますか?
>>小数点以下は、10桁に収まるよう切り捨てたいと思っております。
> 整数部の桁数を求めて、それが 10 桁を超えていたら "E" 表記。
> 10 桁以下なら、「10 - 正数数部桁数」が 小数部の桁数なので、
> それを Math.Round メソッドに指定するというのはどうでしょう。
Math.Round について、少し調べてみたのですが…
どう使えばいいのか、よく理解できません…。(汗)
引用返信 編集キー/
■84466 / inTopicNo.10)  Re[1]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ furu (105回)-(2017/07/06(Thu) 15:50:41)
No84454 (ひかり さん) に返信

> Visual Studio、C#を学び始めて1週間ほどの初心者です。
>
> 現在、Visual StudioでC#を使って「電卓」を作っています。
> 期限が今日の17時と差し迫っています。

残り1時間でMath.Roundまでやるの無理なんじゃない。
仕様を限定して、ちゃんと動く(落ちない)もの
作ったほうがいいよ。

少し調べてわからないぐらいだから
引用返信 編集キー/
■84467 / inTopicNo.11)  Re[4]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ピジョン (1回)-(2017/07/06(Thu) 15:53:20)
貴方が知らないMath.Roundを使ったがために
先生に要らぬツッコミを入れられてしまうかも知れませんよ。

ここは、単純に、整数部10桁以下なら、数字を文字列化して
必要桁の文字だけ取り出して終わりにしたらどうですか?

今日5時の締め切りならば、
最初のときよりは随分よいはずなので。

引用返信 編集キー/
■84471 / inTopicNo.12)  Re[5]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (6回)-(2017/07/06(Thu) 16:37:42)
No84467 (ピジョン さん) に返信
> 貴方が知らないMath.Roundを使ったがために
> 先生に要らぬツッコミを入れられてしまうかも知れませんよ。
>
> ここは、単純に、整数部10桁以下なら、数字を文字列化して
> 必要桁の文字だけ取り出して終わりにしたらどうですか?
>
> 今日5時の締め切りならば、
> 最初のときよりは随分よいはずなので。
ありがとうございます。
たしかに、中途半端な付け焼刃でやってしまっては、あとの指摘が怖いですね…。

11桁以上のときに限り、頭から10桁目までを取り出して、以降は「+e」と表示される処理にしました。
引用返信 編集キー/
■84472 / inTopicNo.13)  Re[2]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (7回)-(2017/07/06(Thu) 16:38:49)
No84466 (furu さん) に返信
> 残り1時間でMath.Roundまでやるの無理なんじゃない。
> 仕様を限定して、ちゃんと動く(落ちない)もの
> 作ったほうがいいよ。
ありがとうございます。
そうさせていただきました。
引用返信 編集キー/
■84473 / inTopicNo.14)  Re[3]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ 魔界の仮面弁士 (1338回)-(2017/07/06(Thu) 16:44:00)
No84472 (ひかり さん) に返信
>>残り1時間でMath.Roundまでやるの無理なんじゃない。
>>仕様を限定して、ちゃんと動く(落ちない)もの
>>作ったほうがいいよ。
> ありがとうございます。
> そうさせていただきました。

「0 除算」への対処も忘れずに。
引用返信 編集キー/
■84474 / inTopicNo.15)  Re[3]: C#での文字数制限について。(期限が近く、急いでいます!)
□投稿者/ ひかり (8回)-(2017/07/06(Thu) 16:44:31)
魔界の仮面弁士さん、shuさん、774RRさん、ピジョンさん、furuさん。
ありがとうございました!
おかげさまで、期限に間に合いました!

本当に、ありがとうございました!!


以下、ソースコードです。
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Cal
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//boolでisFirstを代入。
bool isFirst = true;
//decimalで値1を代入。
decimal 値1 = 0;

private void btnNumber_Click(object sender, EventArgs e)
{
if (isFirst)
{
txtDisplay.Text = "";
isFirst = false;
}

//ディスプレイの入力文字数を10桁に制限する。
if (txtDisplay.TextLength == 10)
{
return;
}

String text = txtDisplay.Text + ((Button)sender).Text;
//文字列を数字に。
decimal d = Convert.ToDecimal(text);
//数字を文字列に。(先頭の“0”が消える)
String text2 = d.ToString();
txtDisplay.Text = text2;
}

//クリア。
private void btnC_Click(object sender, EventArgs e)
{
演算 = 四則演算の記号.未定義;
txtDisplay.Text = "0";
値1 = 0;
isFirst = true;

//クリアボタンが押されたとき、e表示によって発生していたボタンの無効化が解除される。
this.btn0.Enabled = true;
this.btn1.Enabled = true;
this.btn2.Enabled = true;
this.btn3.Enabled = true;
this.btn4.Enabled = true;
this.btn5.Enabled = true;
this.btn6.Enabled = true;
this.btn7.Enabled = true;
this.btn8.Enabled = true;
this.btn9.Enabled = true;
this.btnAdd.Enabled = true;
this.btnSub.Enabled = true;
this.btnMul.Enabled = true;
this.btnDiv.Enabled = true;
this.btnDot.Enabled = true;
this.btnEqu.Enabled = true;
}

//小数点。
private void btnDot_Click(object sender, EventArgs e)
{
//四則演算の記号を押された直後の . にも対応。(0. と続くようになる)
if (isFirst)
{
txtDisplay.Text = "0";
isFirst = false;
}
//小数点の重複チェック。
if (txtDisplay.Text.IndexOf(".") >= 0)
{
//既に小数点がある。
return;
}
txtDisplay.Text = txtDisplay.Text + ".";
isFirst = false;
}

//“enum”で名前を付ける。
enum 四則演算の記号 { 未定義, ADD, SUB, MUL, DIV };
四則演算の記号 演算 = 四則演算の記号.未定義;

//足し算。
private void btnAdd_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.ADD;
}

//引き算。
private void btnSub_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.SUB;
}

//掛け算。
private void btnMul_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.MUL;
}

//割り算。
private void btnDiv_Click(object sender, EventArgs e)
{
if (!isFirst) calc();
演算 = 四則演算の記号.DIV;
}

//イコール。
private void btnEqu_Click(object sender, EventArgs e)
{
calc();

//計算結果が11桁以上になった場合は、“e”(エラー)表示する。(イコールを複数回続けて押した場合も、これで対応できる)
if (txtDisplay.TextLength >= 11)
{

string s;
//int型を文字列に変換
int i = txtDisplay.TextLength;
s = i.ToString();
string A = txtDisplay.Text;
string s1 = A.Substring(0, 10);

txtDisplay.Text = s1 + "+e";

//eが表示された場合、クリア以外のボタンを無効化する。
this.btn0.Enabled = false;
this.btn1.Enabled = false;
this.btn2.Enabled = false;
this.btn3.Enabled = false;
this.btn4.Enabled = false;
this.btn5.Enabled = false;
this.btn6.Enabled = false;
this.btn7.Enabled = false;
this.btn8.Enabled = false;
this.btn9.Enabled = false;
this.btnAdd.Enabled = false;
this.btnSub.Enabled = false;
this.btnMul.Enabled = false;
this.btnDiv.Enabled = false;
this.btnDot.Enabled = false;
this.btnEqu.Enabled = false;
}
}

//イコールを複数回続けて押したときのために、もともとの数値(それまでの計算の答え)を tmp に保管しておく。
decimal tmp;
private void calc()
{
decimal 値2;
if (isFirst)
{
値2 = tmp;
}
else
{
値2 = Convert.ToDecimal(txtDisplay.Text);
tmp = 値2;
}

switch (演算)
{
case 四則演算の記号.ADD:
値1 += 値2;
break;
case 四則演算の記号.SUB:
値1 -= 値2;
break;
case 四則演算の記号.MUL:
値1 *= 値2;
break;
case 四則演算の記号.DIV:
値1 /= 値2;
break;
default:
値1 = 値2;
break;
}

txtDisplay.Text = 値1.ToString();
isFirst = true;
}

private void Form1_Load(object sender, EventArgs e)
{
//テキストボックスを使用したtxtDisplayを読み取り専用にする。
this.txtDisplay.ReadOnly = true;
}

}
}
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -