2016-12-03 3 views
2

Я хочу перевести минуты в секунды и на данный момент у меня есть проблемы, потому что в минуту текстовое поле, когда я печатаю 1.50 исход составляет 90 секунд, что является неправильным, потому что 1.30 = 90 секундTimeSpan Конверсия

private void MtoCbutton_Click(object sender, EventArgs e) 
    { 
     if (minTosecTextBox.Text != "Minutes") 
     { 
      minutes = Convert.ToDouble(minTosecTextBox.Text); 
      TimeSpan span = TimeSpan.FromMinutes(minutes); 
      resultSectextBoxtextBox.Text = span.TotalSeconds.ToString(); 
     } 

     else 
     { 

      MessageBox.Show("Please enter Minutes"); 
     } 
+2

Это правильно, что 1,5 минуты, т.е. одна минута, и полтора, соответствуют 90 секунд ... –

+1

одна минута 60 секунд. поэтому '1.5 * 60 = 90' –

ответ

-2

Для преобразования от секунд до минут вам просто нужно разделить на 60.0 (вам нужно десятичное число или оно будет рассматриваться как целое число). Если обработать как целое число и вы пройдете 30 секунд, то 30/60 будет равно 0.

Также используйте метод double.TryParse. Прямо сейчас, если кто-то входит в 1.50xx, ваше приложение выйдет из строя. Используйте либо метод double.TryParse, либо используйте механизм catch try или разрешите только числовую запись.

EDIT

Это будет выполнять то, что вы хотите. Я добавил ярлык для вывода вывода, но вы можете его удалить.

double enteredNumber; 
if (double.TryParse(minTosecTextBox.Text, out enteredNumber)) 
{ 
    // This line will get everything but the decimal so if entered 1.45, it will get 1 
    double minutes = Math.Floor(enteredNumber); 

    // This line will get the seconds portion from the entered number. 
    // If the number is 1.45, it will get .45 then multiply it by 100 to get 45 secs 
    var seconds = 100 * (enteredNumber - Math.Floor(enteredNumber)); 

    // now we multiply minutes by 60 and add the seconds 
    var secondsTotal = (minutes * 60 + seconds); 

    this.labelSeconds.Text = secondsTotal.ToString(); 
} 

else 
{ 

    MessageBox.Show("Please enter Minutes"); 
} 

EDIT 2

Некоторые дальнейшие разъяснения

Вы не преобразования минут до нескольких секунд, так как если бы вы были тогда 1.5 (1 минуту и ​​половина) будет равна 90 секунд. Это логично и очевидно. Вы обрабатываете только часть перед десятичной точкой в ​​виде минут, а часть после десятичной даты должна обрабатываться как секунды (1.30 = 1 минута и 30 секунд = 90 секунд). Поэтому нам нужно только преобразовать часть до десятичной дроби в секундах и добавить к ней часть после десятичной дроби.

+0

Этот метод не будет работать во всех средах, где разделитель десятичных знаков не является точкой. «1,45», например, вернется не 105, а 8700 секунд в большинстве стран Европы. Используйте ответ от @Paolo. – Gustav

+0

Спасибо за комментарий, но зачем кому-то вводить 1,45 в, например, в Франции, если для них десятичная запятая является запятой. Они войдут в 1,45 (запятая) и произведут 105 секунд. Причина, по которой я поставил этот ответ, состоит в том, что OP хотел простого ответа. Вышеуказанные работы и это не подведет. Попробуйте, и он будет работать в каждой локальной среде (среде). – CodingYoshi

+0

Нет, 1.45 десятичных минут - 87 секунд, а не 105. Но я тоже вводил в заблуждение, и я даже отправил ответ по этой линии. Однако, по-другому, здесь мы используем запятую как разделитель десятичной дроби, и она никогда не будет использоваться в качестве разделителя времени; Фактически, ввод 1,45 здесь, несомненно, будет читаться как десятичные минуты, а не 1 минута и 45 секунд. Поэтому я удалил свой ответ и поддержал @ Paolo, потому что он будет работать повсюду, в то время как ваш провалится в большинстве стран Европы. Конечно, если вы работаете только в средах США, все это можно игнорировать. Но на этой стороне пруда такие проблемы - проблемы каждого дня. – Gustav

2

Вы необходимо обрабатывать преобразование текста по-разному. Вы конвертируете «1.50» непосредственно в двойную, которая составляет 1,5 и 1 и 1/2 минуты, будет эквивалентна 90 секундам. Если вы хотите разрешить пользователю вводить «1.50» и означать, 1 минуту и ​​50 секунд, вам нужно разделить строку. Вы могли бы сделать что-то вроде этого:

var split = text.Split('.'); 
int seconds = 0; 
if (split.Length > 1) 
{ 
    seconds = int.Parse(split[1]); 
} 
seconds += TimeSpan.FromMinutes(split[0]).Seconds; 

Примечание - если вы не подтвердите текст, чем вы могли бы в конечном итоге с этим терпит неудачу. Вероятно, вы должны использовать TryParse для проверки секунд. Параметр может вызывать исключение.

+0

TimeSpan.Parse - лучшее решение – Winter

+0

@Winter - за исключением того, что это исключение для этой строки, поскольку оно не в допустимом формате. – pstrjds

+0

Это был пример, он может изменить формат, в то время как с вашим примером вы не можете. – Winter

7

Вы, вероятно, ищете что-то вроде метода TimeSpan.Parse:

var ts = TimeSpan.Parse("00:01:30"); 

Это произведет TimeSpan 90 секунд.

Существует также ParseExact метод, который позволяет указать формат строки, так что вам не нужно указывать часов каждый раз, и позволяет даже указать точку в качестве разделителя:

var ts = TimeSpan.ParseExact("01.30", @"mm\.ss", System.Globalization.CultureInfo.InvariantCulture); 

Для строки формата см. Custom Date and Time format strings.

Также обратите внимание, что вам необходимо избегать каждого символа, который должен интерпретироваться буквально (отсюда \ до .).

Полный код для Вашего случая:

var ts = TimeSpan.ParseExact(minTosecTextBox.Text, @"mm\.ss", System.Globalization.CultureInfo.InvariantCulture); 
resultSectextBoxtextBox.Text = ts.TotalSeconds.ToString(); 
+0

Я не могу войти в данные сам, так что я могу положить в() минуты, где хранится значение, или текстовое поле, где значение от –

+1

. Вы слишком усложняетесь для человека, который очень мало знает о C# –

+0

@MMobeenKhan извините, я не понимаю, что вы просите с вашим комментарием ... –