Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
pad0n
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 25
#1

Как узнать длину числа - C#

30.07.2013, 15:50. Просмотров 4312. Ответов 12
Метки нет (Все метки)

Собственно сабж: как узнать длину числа, если это float / double...
Как узнать сколько всего цифр есть в числе.. допустим 123456.78 - это 8 цыфр...
Перевести в строку и узнать длину не катит, так как в таком случае будет не 8 а 9 знаков (посчитает еще и "."). Или еще хуже - может быть не только точка, но и минус в начале типа -123.455678 тогда уже не 8 символов, а 9.

Что делать?
http://www.cyberforum.ru/csharp-beginners/thread2019963.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 15:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как узнать длину числа (C#):

Как узнать длину массива
DataClasses1DataContext db = new DataClasses1DataContext(); var...

Как узнать длину строки
Казалось бы, вопрос глупый. Берём что-то наподобие string s = "Veterinar";...

Как узнать длину строки
Как узнать длинну строки string xc = "asdfghjk"; byte l =...

Как узнать длину нарисованного текста
Привет все. Возникла проблемка... Мне нужно поставить нарисованый текст по...

Как узнать длину элемента HashTable?
Пример кода Hashtable htarr = new Hashtable(); htarr.Add("first", new...

12
Smems
149 / 148 / 29
Регистрация: 21.05.2010
Сообщений: 338
30.07.2013, 16:04 #2
pad0n, сделайте Replace '.', ',' и '-' на string.Empty. После узнаете length.
Либо, чтоб наверняка можно как-то так, к примеру:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Linq;
 
namespace sdf
{
    class Program
    {
        static void Main(string[] args)
        {
            double a = -123456.78;
            string b = string.Empty;
            char[] numbers = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
 
            foreach (char c in a.ToString().ToArray())
            {
                if (numbers.Any(f => f == c))
                    b += c;
            }
            Console.WriteLine(b.Length);
            Console.ReadLine();
        }
    }
}
Добавлено через 7 минут
pad0n, или вот, что меньше:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Linq;
 
namespace sdf
{
    class Program
    {
        static void Main(string[] args)
        {
            double a = -123456.78;
            string b = string.Empty;
            char[] numbers = new char[10];
 
            for (int i = 0; i < 10; i++)
                numbers[i] = Convert.ToChar(i.ToString());
 
            b = a.ToString().ToArray().Where(c => numbers.Any(f => f == c)).Aggregate(b, (current, c) => current + c);
            Console.WriteLine(b.Length);
            Console.ReadLine();
        }
    }
}
1
pad0n
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 25
30.07.2013, 16:12  [ТС] #3
Тоже как вариант, но мне потом еще надо будет перегенерировать число (с некоторыми параметрами).. так что было бы полезно еще узнать, как найти отдельно сколько ЦЕЛЫХ и сколько цифр в ДРОБИ . А уже суму их я бы сделал как количество цифр в числе. Но вот тут опять вопрос.. КАК? Чтобы отдельно посчитать количество целых - идея есть - конвертнуть в Инт и пощитать (делить на 10 допустим)... а вот дроби?? Как их пощитать.. Вариант опять же как-то парсить строчку, искать где стоит точка.. НО!! Опять же не вариант - так как региональные настройки некоторых стран дают точку, а некоторых стран - запятую.

И так вопрос (если кому то было впадло все читать): как отдельно узнать количество цифр целой части числа и отдельно то же для дроби.
0
buntar
524 / 525 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
30.07.2013, 16:12 #4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void Main()
    {
        double a = -123456.78;
        Console.WriteLine(GetNumberLength(a));
    }
    public static int GetNumberLength(object o)
    {
        if (o is Double || o is float || o is Int16)
        {
            int count = 0;
            foreach (char i in o.ToString().ToCharArray())
                if (char.IsDigit(i)) count++;
            return count;
        }
        return -1;
    }
1
pad0n
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 25
30.07.2013, 16:23  [ТС] #5
Спасибо, вариант супер!
Но все же вопрос: как отдельно узнать количество цифр целой части числа и отдельно то же для дроби. Мне пригодится для задания.
0
Евгений В
869 / 638 / 128
Регистрация: 01.03.2010
Сообщений: 1,200
30.07.2013, 16:28 #6
pad0n,

C#
1
2
3
4
5
6
7
            double n = -123.4556789;
            int countDigit = n.ToString().Where(x =>  x != '-' && x != '.' && x != ',' ).Count();
 
            int posPoint = n.ToString().IndexOf(',');
 
            int rightCount = n.ToString().Count() - posPoint -1;
            int leftCount = countDigit - rightCount;
0
pad0n
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 25
30.07.2013, 16:33  [ТС] #7
Цитата Сообщение от Евгений В Посмотреть сообщение
int posPoint = n.ToString().IndexOf(',');
Опять же, а вдруг програма запускается на компе, где стоит английская локалка, тогда "," не будет найдено..
0
buntar
524 / 525 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
30.07.2013, 16:35 #8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public static void Main()
    {
        double a = -123456.78;
        Console.WriteLine(GetNumberLength(a));
    }
    public static string GetNumberLength(object o)
    {
        if (o is Double || o is float )
        {
            string [] arr;
            if(o.ToString().Contains("-"))
                arr = o.ToString().Remove(0,1).Split(',');
            else 
                arr = o.ToString().Split(',');
           
            if(arr.Length==2)
                return "целая часть: "+arr[0].Length+ "\nдробная часть: "+arr[1].Length;
            else return "целая часть: " + arr[0].Length;
        }
        return "error";
    }
0
Smems
149 / 148 / 29
Регистрация: 21.05.2010
Сообщений: 338
30.07.2013, 16:38 #9
pad0n, так можно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
 
namespace sdf
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal a = new decimal(-123456.78);
            int b = Math.Abs((int) a);
            Console.WriteLine(b.ToString().Length); // длина целой части
            decimal c = Math.Abs(a) - b;
            Console.WriteLine(c.ToString().Length - 2); // дробной
            Console.ReadLine();
        }
    }
}
0
Евгений В
869 / 638 / 128
Регистрация: 01.03.2010
Сообщений: 1,200
30.07.2013, 16:42 #10
Цитата Сообщение от pad0n Посмотреть сообщение
Опять же, а вдруг програма запускается на компе, где стоит английская локалка, тогда "," не будет найдено..
C#
1
 int posPoint = n.ToString().Replace( '.', ',' ) .IndexOf(',');
1
AQdf
2 / 2 / 0
Регистрация: 30.07.2013
Сообщений: 10
30.07.2013, 16:45 #11
static void Main(string[] args)
{
double number = -245.234224;
int sum = 0;
byte[] b = Encoding.Default.GetBytes(number.ToString());

sum = SumOfAllDigits(sum, b);

Console.WriteLine("Sum of digits is {0}", sum);

b = Encoding.Default.GetBytes(((int)number).ToString());
int sum2 = SumOfAllDigits(sum, b);

Console.WriteLine("Sum of digits before dot is {0}", sum2);
Console.WriteLine("Sum of digits after dot is {0}", Math.Abs(sum - sum2));

Console.ReadKey();
}

private static int SumOfAllDigits(int sum, byte[] b)
{
sum=0;
foreach (byte bi in b)
{
if ((bi >= 48) && (bi <= 57)) sum++;
}
return sum;
}
0
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,288
30.07.2013, 16:51 #12
Ох уж эти "погроммисты" с их строками...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int GetWholeDigitCount(decimal x)
{
    x = Math.Abs(x);
 
    int count = 1;
    while ((x /= 10) > 1) ++count;
    return count;
}
int GetFractionalDigitCount(decimal x)
{
    x = Math.Abs(x);
 
    int count = 0;
    while (x % 1 != 0) { ++count; x *= 10; }
    return count;
}
2
pad0n
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 25
30.07.2013, 16:54  [ТС] #13
Цитата Сообщение от kolorotur Посмотреть сообщение
Ох уж эти "погроммисты" с их строками...
Интересное решение с знаками после запятой... Спасибо
0
30.07.2013, 16:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 16:54
Привет! Вот еще темы с решениями:

Как узнать длину строки в байтах?
Есть код: using (FileStream fs = File.Create(fileName)) ...

Узнать длину контейнера List
Гдето видел List.Length(), но в С# этого нету. как быть?

Узнать длину отправляемого пакета на сервере
Написал клиент-серверное приложение. Все работает,но вот только когда...

Узнать длину HashSet<T> при неизвестном Т
Здравствуйте, как можно узнать длину HashSet&lt;T&gt; при неизвестном типе элементов?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru