Ограничить длину дробной части в строке с помощью Stream API

227
02 мая 2017, 05:21

Мне необходимо ограничить количество символов в строке после '.' до 6. К примеру, из "0.123456789" получить "0.123456".

Можно ли решить данную задачу используя Stream API?

Императивное решение у меня получилось такое:

static String f(String s) {
    if (s.contains(".")) {
        String dec = s.substring(s.indexOf('.'), s.length());
        if (dec.length() < 7)
            return s;
        else {
            String i = s.substring(0, s.indexOf('.'));
            return i + dec.substring(0, 7);
        }
    }
    else {
        return s;
    }
}
Answer 1

Решение с использованием indexOf и substring можно укоротить:

public static String f(String str)
{
    final int maxCount = 6;
    int index = str.indexOf('.') + maxCount + 1;
    if (index == maxCount || index >= str.length())
    {
        return str;
    }
    return str.substring(0, index);
}

if и 2 return-a можно записать ещё короче:

return (index == maxCount || index >= str.length()) ? str : str.substring(0, index);

но это уже "на любителя", так как выражение получается достаточно длинное.

Добавить Stream символов строки, получаемый с помощью метода chars, сюда можно, однако дабы это не получилось сверхсложно и сверхкостыльно, высчитывание индекса и возврат str если символов после . меньше 6 придётся оставить вне потока. В результате, по сути, просто код str.substring(0, index) превращается в несколько строк кода:

public static String f(String str)
{
    final int maxCount = 6;
    int index = str.indexOf('.') + maxCount + 1;
    if (index == maxCount || index >= str.length())
    {
        return str;
    }
    return str.chars()
            .limit(index)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();
}
READ ALSO
Как добавить в меню Drawer Layout текст?

Как добавить в меню Drawer Layout текст?

ЗдравствуйтеКак добавить в меню Drawer Layout текст? Подробности на рисунке

254
RecyclerView внутри NestedScrollView

RecyclerView внутри NestedScrollView

Сделал горизонтальный RecyclerView внутри NestedScrollViewВ итоге при запуске активности если RecyclerView не торчит на определенную высоту, то он сам делает...

400
Отправка ajax post запроса к сервлету

Отправка ajax post запроса к сервлету

Не могу никак отправить простейший запрос к сервлету средствами jQueryНо при это если отправляю через форму, то все работает на ура

325
Recyclerview слетает анимация с элемента при скроллинге списка

Recyclerview слетает анимация с элемента при скроллинге списка

Необходимо задать анимацию нажатому элементу спискаЯ делаю это так:

333