Вставить символы в строку вразброс одним махом.. можно ли?
От: nt2000  
Дата: 28.09.19 19:29
Оценка:
у строки такой нюанс: она состоит из цифр.

нужно вставить запятые через каждые три знака начиная сзади(как разделители тысячных разрядов у буржуев)

можно без прохода?

сразу в голову приходит превратить в целое потом формат #.### и обратно в строку..

пока не удается форматировать, (странно вроде раньше получалось легко)

потом мне это не нравится: строка может оказаться слишком длинной для преобразования в целое

и еще сомневаюсь что удасться целое преобразить в строку с сохранением запятых.
Re: Вставить символы в строку вразброс одним махом.. можно ли?
От: Ночной Смотрящий Россия  
Дата: 28.09.19 19:48
Оценка:
Здравствуйте, nt2000, Вы писали:

N>можно без прохода?


Нет.

N>сразу в голову приходит превратить в целое потом формат #.### и обратно в строку..


Это будет с проходом.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Вставить символы в строку вразброс одним махом.. можно ли?
От: nt2000  
Дата: 28.09.19 20:58
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

N>>сразу в голову приходит превратить в целое потом формат #.### и обратно в строку..


НС>Это будет с проходом.

я имел ввиду нечто подобное
static string Ааааа(string s){
    return  string.Format("{0:#,###}", s)  ;
    return  int.Parse(s).ToString(s,"0,000")  ;
Re[3]: Вставить символы в строку вразброс одним махом.. можно ли?
От: Ночной Смотрящий Россия  
Дата: 28.09.19 20:59
Оценка:
Здравствуйте, nt2000, Вы писали:

НС>>Это будет с проходом.

N>я имел ввиду нечто подобное

int.Parse внутри будет делать проход
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Вставить символы в строку вразброс одним махом.. можно ли?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.09.19 22:46
Оценка:
Здравствуйте, nt2000, Вы писали:

N>можно без прохода?

Совсем без — нельзя. Кто-то будет делать проход. Либо int.Parse, либо самому.

N>сразу в голову приходит превратить в целое потом формат #.### и обратно в строку..


N>пока не удается форматировать, (странно вроде раньше получалось легко)

гугл в помощь.

N>потом мне это не нравится: строка может оказаться слишком длинной для преобразования в целое

Есть BigInteger

N>и еще сомневаюсь что удасться целое преобразить в строку с сохранением запятых.

В целом нет запятых.
Re: Вставить символы в строку вразброс одним махом.. можно ли?
От: romangr Россия  
Дата: 29.09.19 07:08
Оценка: +1
Здравствуйте, nt2000, Вы писали:

N>у строки такой нюанс: она состоит из цифр.


N>нужно вставить запятые через каждые три знака начиная сзади(как разделители тысячных разрядов у буржуев)


Можно как-то так:
public static string FormatString(string input)
{
    if (string.IsNullOrEmpty(input))
    {
        return string.Empty;
    }
    var buf = new StringBuilder(input.Length + (input.Length - 1) / 3);
    var index = 0;
    while (index < input.Length % 3)
    {
        buf.Append(input[index++]);
    }
    while (index < input.Length)
    {
        if (index > 0)
        {
            buf.Append(',');
        }
        buf.Append(input[index++]);
        buf.Append(input[index++]);
        buf.Append(input[index++]);
    }
    return buf.ToString();
}
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Вставить символы в строку вразброс одним махом.. можно ли?
От: Kolesiki  
Дата: 29.09.19 09:10
Оценка:
Здравствуйте, nt2000, Вы писали:

N>можно без прохода?


А чем он так плох-то?
Ну можно ещё сплит(кусочками по три) потом джойн с запятыми.
Re[2]: Вставить символы в строку вразброс одним махом.. можно ли?
От: nt2000  
Дата: 29.09.19 16:59
Оценка:
Здравствуйте, Kolesiki, Вы писали:

N>>можно без прохода?


K>А чем он так плох-то?

K>Ну можно ещё сплит(кусочками по три) потом джойн с запятыми.

  мне предложили вот такое
public static string FormatString(string input)
{
    if (string.IsNullOrEmpty(input))
    {
        return string.Empty;
    }
    var buf = new StringBuilder(input.Length + (input.Length - 1) / 3);
    var index = 0;
    while (index < input.Length % 3)
    {
        buf.Append(input[index++]);
    }
    while (index < input.Length)
    {
        if (index > 0)
        {
            buf.Append(',');
        }
        buf.Append(input[index++]);
        buf.Append(input[index++]);
        buf.Append(input[index++]);
    }
    return buf.ToString();
}


а я хочу вот так
static string F(string s)
    return  string.Format("{0:#.###}",s);
    return  int.Parse(s).ToString(s,"0,000");
Re[3]: Вставить символы в строку вразброс одним махом.. можно ли?
От: Ночной Смотрящий Россия  
Дата: 29.09.19 17:40
Оценка:
Здравствуйте, nt2000, Вы писали:

N>а я хочу вот так


Цель то какая? Лабу сдать или что то в реальном продукте сделать?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Вставить символы в строку вразброс одним махом.. можно ли?
От: nt2000  
Дата: 29.09.19 21:15
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:


НС>Цель то какая? Лабу сдать или что то в реальном продукте сделать?


Просто, учу язык.
Re[2]: Вставить символы в строку вразброс одним махом.. можно ли?
От: nt2000  
Дата: 29.09.19 21:22
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Ну можно ещё сплит(кусочками по три) потом джойн с запятыми.


split to что надо, но....
string a = "44444444";
   Console.WriteLine( a  );
   Console.WriteLine( a .Length );
            int b = int.Parse(a) ;
   Console.WriteLine(b  );
 
        string     s = string.Format( "{0:0,000}",б);
   Console.WriteLine( s );
   Console.WriteLine( s .Length );

//!!! вот тут начинаются чудеса
            Console.WriteLine(s.Contains(" "));
            Console.WriteLine(s.Replace(' ', ',') );

            string[]c=s.Split(' ' );
            string.Join(',',c) ;
Re: Вставить символы в строку вразброс одним махом.. можно ли?
От: ltc  
Дата: 30.09.19 11:48
Оценка:
Здравствуйте, nt2000, Вы писали:

N>у строки такой нюанс: она состоит из цифр.


N>нужно вставить запятые через каждые три знака начиная сзади(как разделители тысячных разрядов у буржуев)


С точки зрения скорости не самый лучший вариант, зато лаконично и функционально:

var number = "1234567890";
    
var len = number.Length;
var bld = new StringBuilder(len + len / 3);
number.ToCharArray().Select((ch, ix) =>  bld.Append(ix > 0 && (len - ix) % 3 == 0 ? new [] { ',', ch } : new [] { ch })).ToList();
    
Console.WriteLine(bld.ToString());
Re[2]: Вставить символы в строку вразброс одним махом.. можно ли?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.09.19 12:59
Оценка: +1
Здравствуйте, ltc, Вы писали:

ltc>С точки зрения скорости не самый лучший вариант, зато лаконично и функционально:


ltc>
ltc>var number = "1234567890";
    
ltc>var len = number.Length;
ltc>var bld = new StringBuilder(len + len / 3);
ltc>number.ToCharArray().Select((ch, ix) =>  bld.Append(ix > 0 && (len - ix) % 3 == 0 ? new [] { ',', ch } : new [] { ch })).ToList();
    
ltc>Console.WriteLine(bld.ToString());
ltc>

Лаконично — на вкус и цвет, а вот функционально — точно нет, т.к. использован изменяемый StringBuilder.

new string(
    String.Concat(
        "1234567890"
        .Reverse()
        .Zip(
            Enumerable.Repeat(new[] { "", "", "," }, int.MaxValue).SelectMany(a => a),
            (c, s) => $"{c}{s}"))
    .Reverse()
    .ToArray())
Re[3]: Вставить символы в строку вразброс одним махом.. можно ли?
От: ltc  
Дата: 30.09.19 14:56
Оценка:
Здравствуйте, samius, Вы писали:

S>Лаконично — на вкус и цвет, а вот функционально — точно нет, т.к. использован изменяемый StringBuilder.


S>
S>new string(
S>    String.Concat(
S>        "1234567890"
S>        .Reverse()
S>        .Zip(
S>            Enumerable.Repeat(new[] { "", "", "," }, int.MaxValue).SelectMany(a => a),
S>            (c, s) => $"{c}{s}"))
S>    .Reverse()
S>    .ToArray())
S>


В таком случае все равно предпочел бы вот это:

new String("1234567890".ToCharArray().SelectMany((ch, ix) =>  ix > 0 && (number.Length - ix) % 3 == 0 ? new [] { ',', ch } : new [] { ch }).ToArray());
Re[3]: Вставить символы в строку вразброс одним махом.. можно ли?
От: Mihas  
Дата: 30.09.19 15:38
Оценка:
Здравствуйте, nt2000, Вы писали:

N>я имел ввиду нечто подобное

N>
static string Ааааа(string s){
N>    return  string.Format("{0:#,###}", s)  ;
N>    return  int.Parse(s).ToString(s,"0,000")  ;

Можно написать свой шаблон для подобного "0:#,###". Рецепт можно найти в недрах документации к String.Format()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.