Событие изменения вызывается, когда значение изменяется при взаимодействии пользователей на странице, а не при изменении значения с использованием кода.
Здесь вам нужно использовать .change()
или .trigger("change")
после изменения значения:
$('.sela').on('change', function(){
if($(this).val() == 'ipsum'){console.log('ipsum');}
});
$('button').on('click', function(){
$('.sela').val('ipsum').change();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select class='sela'>
<option>lorem</option>
<option>ipsum</option>
</select>
<button>CLICK</button>
Используйте Математику. Log10 абсолютного значения двойного для выяснения, сколько 0 Вам нужен любой, уехал (если положительный) или право (если отрицательный) десятичного разряда. Выберите строку формата на основе этого значения. Вы должны будете обработать нулевые значения отдельно.
string s;
double epislon = 0.0000001; // or however near zero you want to consider as zero
if (Math.Abs(value) < epislon) {
int digits = Math.Log10( Math.Abs( value ));
// if (digits >= 0) ++digits; // if you care about the exact number
if (digits < -5) {
s = string.Format( "{0:0.000000000}", value );
}
else if (digits < 0) {
s = string.Format( "{0:0.00000})", value );
}
else {
s = string.Format( "{0:#,###,###,##0.000}", value );
}
}
else {
s = "0";
}
Или создайте его динамично на основе количества цифр.
Вслед за OwenP (и "расширением" tvanfosson):
Если это достаточно распространено, и вы ' Что касается C # 3.0, я бы превратил его в метод расширения на двойном:
class MyExtensions
{
public static string ToFormmatedString(this double d)
{
// Take d and implement tvanfosson's code
}
}
Теперь, где бы у вас ни было двойное, вы можете сделать:
double d = 1.005343;
string d_formatted = d.ToFormattedString();
Первые две Строки. Формат в Вашем вопросе может быть решен путем автоматического удаления конечных нулей:
String.Format("{0:#,##0.########}", number);
И последний Вы могли решить путем вызова Математики. Вокруг (число, 1) для значений более чем 1 000 и затем используют ту же Строку. Формат.
Что-то как:
String.Format("{0:#,##0.########}", number<1000 ? number : Math.Round(number,1));
Используйте # символ для дополнительных положений в строке:
string.Format("{0:#,###,##0.000}", number);
Я не думаю, что можно управлять количеством десятичных разрядов как этот, поскольку точность взаимного завещания, вероятно, портит вещи.
Инкапсулировать логику решения, сколько десятичных разрядов для вывода Вас могло посмотреть на создание пользовательского средства форматирования.
Если бы это был я, то я записал бы пользовательский класс обертки и поместил бы код tvanfosson в ToString
метод. Тем путем Вы могли все еще работать с двойным значением, но Вы вложите правильное строковое представление примерно все случаи. Это выглядело бы примерно так:
class FormattedDouble
{
public double Value { get; set; }
protected overrides void ToString()
{
// tvanfosson's code to produce the right string
}
}
Возможно, могло бы быть лучше сделать это структурой, но я сомневаюсь, что это имело бы большое значение. Вы могли использовать класс как это:
var myDouble = new FormattedDouble();
myDouble.Value = Math.Pi;
Console.WriteLine(myDouble);