Рейтинг:
2
User 11061201
Use String.Split
string decPoint = ".";
string decNumber = "1241.546";
string result = decNumber.Split(CChar(decPoint))(1) //546
result = decPoint + result; //.546
Member 13408542
Показывает как CChar не существует в текущем контексте
Member 13408542
Не уверен, что я прав, но разве мой код не делает точно то же самое?
Рейтинг:
2
Graeme_Grant
Преобразуйте в десятичную дробь для точных вычислений, тогда это просто. Для этого я создал метод расширения:
static class DoubleExtension
{
public static double GetDecimalPart(this double value)
{
var num = Convert.ToDecimal(value);
return Convert.ToDouble(num - (int)num);
}
}
Использовать:
double value = 12345.6789;
double result = value.GetDecimalPart();
// returns: 0.6789
Теперь, если вы хотите удалить десятичную дробь, вам нужно добавить следующее
DoubleExtension
класс:
public static int GetDecimalPart(this double value, int count)
{
return (int)(value.GetDecimalPart() * Math.Pow(10, count));
}
Затем, чтобы использовать:
double value = 12345.6789;
int result = value.GetDecimalPart(5);
// returns: 67890
int result = value.GetDecimalPart(4);
// returns: 6789
int result = value.GetDecimalPart(3);
// returns: 678
ОБНОВЛЕНИЕ: Дейв справедливо указывает, что десятичная точка, никакой ведущий ноль не требуется. Тем не менее, запрос также относится к конечному нулю, поэтому вот фрагмент кода для этого:
double value = 12345.6789;
string finalResult = $".{value.GetDecimalPart(5).ToString()}";
// returns: .67890
И отдать дань уважения решению Дэйва:
double value = 12345.6789;
string finalResult = string.Format("{0}{1}",
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
value.GetDecimalPart(5).ToString());
// returns: .67890
Dave Kreskowiak
Это мило и все, но спецификация должна возвращать десятичную точку вместе с конечными числами, без чего-либо перед десятичной точкой, как в его примере было сказано: ".789". Это то, что int не может вернуть.
Я знаю, это очень странное требование.
Graeme_Grant
Спасибо... возможно,вы захотите проверить мое обновление. ;)
Dave Kreskowiak
Это жульничество, но ладно. Поскольку ОП никогда не прописывал ни точных входных данных, ни требований к возвращаемым значениям, любое решение вообще является тем, которое соответствует ограниченному результату, который он указал.
Graeme_Grant
Молоток... ноготь... вы решаете...: P
I want to take a number say 123456.7890 and remove everything before the decimal the leaving .7890
Dave Kreskowiak
Он никогда не говорил, для чего используется это странное требование. Его пример кода также, по-видимому, говорит о том, что определение точности также может быть необходимым. Кроме того, как насчет передачи целого числа? Десятичной точки нет, поэтому возвращать нечего, кроме пустой строки или исключения. И снова он ничего не говорит.
Так много вопросов, так мало ответов.
Graeme_Grant
Да, мне тоже интересно... Но просто для того, чтобы играть в нее (на международном уровне) безопасно, я добавил дань уважения вашему решению ;)
Рейтинг:
1
Dave Kreskowiak
Ваша операция не имеет большого смысла, и вы явно не описываете, что должно произойти в каждом случае, когда вы собираетесь использовать это. Другими словами, каковы ваши тестовые и граничные случаи? Важно ли количество десятичных знаков или оно должно возвращать только то, что находится справа от десятичной дроби, даже если там ничего нет (целое число)? Имеет ли значение культура? Не все форматируют числа типа "123 456,789". Вы также можете иметь "123.456, 789".
Версия quick'n'Dirty, которая обрабатывает культуру, может быть:
/// <summary>
/// Returns a string with everything to the right of the decimal point,
/// inclusive of the decimal point, for any value type.
/// </summary>
/// <remarks>123,456.789 returns ".789"</remarks>
static string GetValueDecimalString(ValueType value)
{
// Default return value of an Empty string.
string returnValue = string.Empty;
// Get the current culture and extract the decimal separator string.
CultureInfo currentCulture = CultureInfo.CurrentCulture;
string decimalSeparator = currentCulture.NumberFormat.NumberDecimalSeparator;
// Convert the passed-in value to a string using the format for the current culture.
string stringValue = Convert.ToString(value);
// Get the index of the decimal separator in the string.
int position = stringValue.IndexOf(decimalSeparator);
// Return the string starting at the position the decimal separator was found.
// If the decimal separator wasn't found, just return the default Empty string.
if (position >= 0)
{
returnValue = stringValue.Substring(position);
}
return returnValue;
}