433 lines
16 KiB
C#
433 lines
16 KiB
C#
//
|
|
// http://www.mediafire.com/download/fidd3mm85dmq9tb/%281392.03.10%29+Numerical+TextBox+Sample.rar
|
|
// 이거도 참고로 볼 것... 비슷하지만, 현재 것이 나아보임 http://www.codeproject.com/Articles/30812/Simple-Numeric-TextBox
|
|
// http://www.thecoolestdolphin.be/?p=38 [Allow only specific characters in textBox in C#]
|
|
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Text.RegularExpressions;
|
|
using System.Windows.Forms;
|
|
|
|
namespace SystemX.Net.Platform.Common.Util
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class NumericTextBox : TextBox
|
|
{
|
|
private bool _negative;
|
|
private bool _dot;
|
|
private bool _exponent;
|
|
private int _decimalNumber;
|
|
private int _cursorPositionPlus;
|
|
private char _discriminant;
|
|
private double _maxValue;
|
|
private double _minValue;
|
|
private bool _maxCheck;
|
|
private bool _minCheck;
|
|
private string _oldText;
|
|
|
|
public NumericTextBox()
|
|
{
|
|
_decimalNumber = 4;
|
|
_negative = true;
|
|
_dot = true;
|
|
_exponent = true;
|
|
_discriminant = ',';
|
|
_maxValue = 0;
|
|
_minValue = 0;
|
|
_maxCheck = false;
|
|
_minCheck = false;
|
|
_oldText = string.Empty;
|
|
|
|
_balloonTips = new ToolTip()
|
|
{
|
|
ToolTipTitle = "Invalid character.",
|
|
ToolTipIcon = ToolTipIcon.Warning,
|
|
AutoPopDelay = 0,
|
|
ShowAlways = false,
|
|
};
|
|
}
|
|
public NumericTextBox(int decimalNumber)
|
|
: this()
|
|
{
|
|
_decimalNumber = decimalNumber;
|
|
}
|
|
public NumericTextBox(char discriminant)
|
|
: this(4)
|
|
{
|
|
if (discriminant == '\'' || discriminant == '/' || discriminant == '`')
|
|
_discriminant = discriminant;
|
|
else
|
|
_discriminant = ',';
|
|
}
|
|
public NumericTextBox(int decimalNumber, char discriminant)
|
|
: this(discriminant)
|
|
{
|
|
_decimalNumber = decimalNumber;
|
|
}
|
|
|
|
[Description("1000 단위 comma 허용 여부")]
|
|
public int DecimalNumber
|
|
{
|
|
get { return _decimalNumber; }
|
|
set { _decimalNumber = value; OnTextChanged(new EventArgs()); }
|
|
}
|
|
|
|
[Description("음수 허용 여부")]
|
|
public bool Negative
|
|
{
|
|
get { return _negative; }
|
|
set { _negative = value; OnTextChanged(new EventArgs()); }
|
|
}
|
|
[Description("Period 허용 여부")]
|
|
public bool Dot
|
|
{
|
|
get { return _dot; }
|
|
set { _dot = value; OnTextChanged(new EventArgs()); }
|
|
}
|
|
[Description("Scientific notation 허용 여부")]
|
|
public bool Exponent
|
|
{
|
|
get { return _exponent; }
|
|
set { _exponent = value; OnTextChanged(new EventArgs()); }
|
|
}
|
|
public char Discriminant
|
|
{
|
|
get { return _discriminant; }
|
|
set
|
|
{
|
|
if (value == '\'' || value == '/' || value == '`')
|
|
_discriminant = value;
|
|
else
|
|
_discriminant = ',';
|
|
OnTextChanged(new EventArgs());
|
|
}
|
|
}
|
|
public double MaxValue
|
|
{
|
|
get { return _maxValue; }
|
|
set
|
|
{
|
|
_maxValue = (!MinCheck || value >= _minValue) ? value : _maxValue;
|
|
if (_maxCheck && new NumericalString(this.Text) > _maxValue)
|
|
this.Text = _maxValue.ToString();
|
|
}
|
|
}
|
|
public double MinValue
|
|
{
|
|
get { return _minValue; }
|
|
set
|
|
{
|
|
_minValue = (!MaxCheck || value <= _maxValue) ? value : _minValue;
|
|
if (_minCheck && new NumericalString(this.Text) < _minValue)
|
|
this.Text = _minValue.ToString();
|
|
}
|
|
}
|
|
public bool MaxCheck
|
|
{
|
|
get { return _maxCheck; }
|
|
set
|
|
{
|
|
_maxCheck = value;
|
|
if (_maxCheck && new NumericalString(this.Text) > _maxValue)
|
|
this.Text = _maxValue.ToString();
|
|
}
|
|
}
|
|
public bool MinCheck
|
|
{
|
|
get { return _minCheck; }
|
|
set
|
|
{
|
|
_minCheck = value;
|
|
if (_minCheck && new NumericalString(this.Text) < _minValue)
|
|
this.Text = _minValue.ToString();
|
|
}
|
|
}
|
|
public NumericalString NumericalText
|
|
{
|
|
get { return new NumericalString(this.Text); }
|
|
}
|
|
|
|
|
|
public double GetDoubleValue()
|
|
{
|
|
double value;
|
|
if (!Double.TryParse(NumericalText.Text, out value))
|
|
return 0;
|
|
return value;
|
|
}
|
|
public int GetIntValue()
|
|
{
|
|
int value;
|
|
if (!Int32.TryParse(NumericalText.Text, out value))
|
|
return 0;
|
|
return value;
|
|
}
|
|
|
|
|
|
|
|
#region Baloon Tips
|
|
[Description("오류 문자 입력시 풍선 도움말 표시 여부")]
|
|
public bool ShowBalloonTips { get { return _showBalloonTips; } set { _showBalloonTips = value; } }
|
|
private bool _showBalloonTips = true;
|
|
private ToolTip _balloonTips;
|
|
#endregion
|
|
|
|
|
|
protected override void OnTextChanged(EventArgs e)
|
|
{
|
|
_balloonTips.Hide(this);
|
|
_cursorPositionPlus = 0;
|
|
int SelectionStart = this.SelectionStart;
|
|
int TextLength = this.Text.Length;
|
|
int CursorPositionPlus;
|
|
string Text = NormalTextToNumericString();
|
|
CursorPositionPlus = _cursorPositionPlus;
|
|
if ((!_maxCheck || new NumericalString(this.Text) <= _maxValue) && (!_minCheck || new NumericalString(this.Text) >= _minValue))
|
|
{
|
|
this.Text = Text;
|
|
this.SelectionStart = SelectionStart + CursorPositionPlus;
|
|
_oldText = this.Text;
|
|
}
|
|
else
|
|
{
|
|
this.Text = _oldText;
|
|
this.SelectionStart = SelectionStart + _oldText.Length - TextLength;
|
|
}
|
|
base.OnTextChanged(e);
|
|
}
|
|
protected string NormalTextToNumericString()
|
|
{
|
|
string Text = this.Text;
|
|
string TextTemp1 = string.Empty, TextTemp2 = string.Empty;
|
|
#region Lowering Characters
|
|
for (int i = 0; i < Text.Length; i++)
|
|
TextTemp1 += char.ToLower(Text[i]);
|
|
#endregion
|
|
|
|
|
|
#region Remove Unknown Characters
|
|
int FloatNumber = 0;
|
|
for (int i = 0; i < TextTemp1.Length; i++)
|
|
if (_negative && TextTemp1[i] == '-' && i == 0)
|
|
TextTemp2 += TextTemp1[i];
|
|
else if (TextTemp1[i] == '-' && TextTemp2.IndexOf('e') >= 0 && TextTemp2.Length == TextTemp2.IndexOf('e') + 1)
|
|
TextTemp2 += TextTemp1[i];
|
|
else if (char.IsDigit(TextTemp1[i]))
|
|
{
|
|
TextTemp2 += TextTemp1[i];
|
|
if (TextTemp2.IndexOf('.') > -1 && TextTemp2.IndexOf('e') < 0 && i < this.SelectionStart)
|
|
{
|
|
FloatNumber++;
|
|
if (FloatNumber > _decimalNumber && i < this.SelectionStart)
|
|
_cursorPositionPlus--;
|
|
}
|
|
}
|
|
else if (_dot && _decimalNumber > 0 && TextTemp1[i] == '.' && TextTemp2.IndexOf('.') < 0 && (TextTemp2.IndexOf('e') < 0 || TextTemp2.Length < TextTemp2.IndexOf('e')))
|
|
TextTemp2 += TextTemp1[i];
|
|
else if (_exponent && TextTemp1[i] == 'e' && TextTemp2.IndexOf('e') < 0 && TextTemp2.Length >= TextTemp2.IndexOf('.') + 1)
|
|
TextTemp2 += TextTemp1[i];
|
|
else if (i < this.SelectionStart)
|
|
{
|
|
bool skip = _decimalNumber != 0 && TextTemp1[i] == ',';
|
|
if ( ! skip && ShowBalloonTips )
|
|
_balloonTips.Show(String.Format("The character \"{0}\" is invalid.", TextTemp1[i]), this);
|
|
|
|
_cursorPositionPlus--;
|
|
}
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Get Integer Number
|
|
string INTEGER = string.Empty;
|
|
int IntegerIndex = (TextTemp2.IndexOf('.') >= 0) ? TextTemp2.IndexOf('.') : (TextTemp2.IndexOf('e') >= 0) ? TextTemp2.IndexOf('e') : TextTemp2.Length;
|
|
for (int i = 0; i < IntegerIndex; i++)
|
|
if (char.IsDigit(TextTemp2[i]) || TextTemp2[i] == '-' && INTEGER.IndexOf('-') < 0)
|
|
INTEGER += TextTemp2[i];
|
|
#endregion
|
|
#region Get Float Number
|
|
string FLOAT = string.Empty;
|
|
if (TextTemp2.IndexOf('.') >= 0)
|
|
for (int i = TextTemp2.IndexOf('.') + 1; i < ((TextTemp2.IndexOf('e') >= 0) ? TextTemp2.IndexOf('e') : TextTemp2.Length); i++)
|
|
if (char.IsDigit(TextTemp2[i]))
|
|
FLOAT += TextTemp2[i];
|
|
#endregion
|
|
#region Put '/' Character in Integer Number
|
|
string T = string.Empty;
|
|
int n = 0;
|
|
for (int i = INTEGER.Length - 1; i >= 0; i--)
|
|
{
|
|
T += INTEGER[i];
|
|
n++;
|
|
if (n == 3 && i > 0 && INTEGER[i - 1] != '-')
|
|
{
|
|
if (i - _cursorPositionPlus < this.SelectionStart)
|
|
_cursorPositionPlus++;
|
|
T += _discriminant.ToString();
|
|
n = 0;
|
|
}
|
|
}
|
|
char[] charArray = T.ToCharArray();
|
|
Array.Reverse(charArray);
|
|
T = new string(charArray);
|
|
#endregion
|
|
#region Put '.' Character
|
|
if (TextTemp2.IndexOf('.') >= 0)
|
|
{
|
|
T += ('.').ToString();
|
|
for (int i = 0; i < DecimalNumber && i < FLOAT.Length; i++)
|
|
T += FLOAT[i];
|
|
}
|
|
#endregion
|
|
#region Put 'e' Character
|
|
if (TextTemp2.IndexOf('e') >= 0)
|
|
{
|
|
T += ('e').ToString();
|
|
for (int i = TextTemp2.IndexOf('e') + 1; i < TextTemp2.Length; i++)
|
|
T += TextTemp2[i];
|
|
}
|
|
#endregion
|
|
return T;
|
|
}
|
|
}
|
|
public class NumericalString
|
|
{
|
|
private string _text;
|
|
public string Text
|
|
{
|
|
get { return _text; }
|
|
set { _text = value; }
|
|
}
|
|
public NumericalString()
|
|
{
|
|
_text = string.Empty;
|
|
}
|
|
public NumericalString(string Text)
|
|
{
|
|
string Temp = string.Empty;
|
|
for (int i = 0; i < Text.Length; i++)
|
|
if (char.IsDigit(Text[i]) || Text[i] == '-' || Text[i] == '.' || Text[i] == 'e')
|
|
Temp += Text[i];
|
|
_text = Temp;
|
|
}
|
|
public override string ToString()
|
|
{
|
|
return (this.Text == string.Empty) ? "0" : this.Text;
|
|
}
|
|
public static implicit operator NumericalString(string Text)
|
|
{
|
|
return new NumericalString(Text);
|
|
}
|
|
public static explicit operator string(NumericalString Text)
|
|
{
|
|
return (Text.Text == "") ? "0" : Text.Text;
|
|
}
|
|
public static implicit operator double(NumericalString Text)
|
|
{
|
|
double value;
|
|
if (Text.Text == "")
|
|
return 0;
|
|
if (Text.Text == "-")
|
|
return 0;
|
|
if (Text.Text == "-.")
|
|
return 0;
|
|
if (Text.Text.StartsWith("-e"))
|
|
return 0;
|
|
if (Text.Text.StartsWith("e"))
|
|
return 0;
|
|
if (Text.Text.EndsWith("e") || Text.Text.EndsWith("e-"))
|
|
return Convert.ToDouble(Text.Text.Substring(0, Text.Text.IndexOf('e')));
|
|
if (!Double.TryParse(Text.Text, out value))
|
|
return Convert.ToDouble(Regex.Replace(Text.Text, @"\D", ""));
|
|
|
|
return Convert.ToDouble(Text.Text);
|
|
}
|
|
public static string operator +(NumericalString Text1, NumericalString Text2)
|
|
{
|
|
return Text1.Text + Text2.Text;
|
|
}
|
|
public static string operator +(NumericalString Text1, string Text2)
|
|
{
|
|
return Text1.Text + Text2;
|
|
}
|
|
public static string operator +(NumericalString Text1, char ch)
|
|
{
|
|
return Text1.Text + ch.ToString();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
public partial class Form1 : Form
|
|
{
|
|
public Form1()
|
|
{
|
|
InitializeComponent();
|
|
numericalTextBox.DecimalNumber = (int)DecimalNumberNumericUpDown.Value;
|
|
numericalTextBox.Negative = NegativeSignCheckBox.Checked;
|
|
numericalTextBox.Dot = DotCheckBox.Checked;
|
|
numericalTextBox.Exponent = ExponentCheckBox.Checked;
|
|
numericalTextBox.MaxValue = System.Convert.ToDouble(MaximumTextBox.Text);
|
|
numericalTextBox.MinValue = System.Convert.ToDouble(MinimumTextBox.Text);
|
|
numericalTextBox.MaxCheck = MaximumCheckBox.Checked;
|
|
numericalTextBox.MinCheck = MinimumCheckBox.Checked;
|
|
numericalTextBox.Discriminant = ',';
|
|
}
|
|
private void DecimalNumberNumericUpDown_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.DecimalNumber = (int)DecimalNumberNumericUpDown.Value;
|
|
}
|
|
private void NegativeSignCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.Negative = NegativeSignCheckBox.Checked;
|
|
}
|
|
private void DotCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.Dot = DotCheckBox.Checked;
|
|
}
|
|
private void ExponentCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.Exponent = ExponentCheckBox.Checked;
|
|
}
|
|
private void MaximumTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.MaxValue = MaximumTextBox.NumericalText;
|
|
}
|
|
private void MinimumTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.MinValue = MinimumTextBox.NumericalText;
|
|
}
|
|
private void MaximumCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.MaxCheck = MaximumCheckBox.Checked;
|
|
MaximumTextBox.Enabled = MaximumCheckBox.Checked;
|
|
}
|
|
private void MinimumCheckBox_CheckedChanged(object sender, EventArgs e)
|
|
{
|
|
numericalTextBox.MinCheck = MinimumCheckBox.Checked;
|
|
MinimumTextBox.Enabled = MinimumCheckBox.Checked;
|
|
}
|
|
private void GroupSeparatorCharacterTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
if (GroupSeparatorCharacterTextBox.Text != "" && GroupSeparatorCharacterTextBox.Text.Length == 1)
|
|
numericalTextBox.Discriminant = System.Convert.ToChar(GroupSeparatorCharacterTextBox.Text);
|
|
else
|
|
numericalTextBox.Discriminant = ',';
|
|
}
|
|
private void numericalTextBox_TextChanged(object sender, EventArgs e)
|
|
{
|
|
NumericalString NS = "Reza";
|
|
string s = numericalTextBox.NumericalText.ToString();
|
|
TextTextBox.Text = (string)numericalTextBox.NumericalText + " Reza";
|
|
DoubleTextBox.Text = (numericalTextBox.NumericalText + 3).ToString();
|
|
ConditionTextBox.Text = (numericalTextBox.NumericalText < 100) ? (string)numericalTextBox.NumericalText : "Over 100";
|
|
}
|
|
}
|
|
*/
|