Как да конвертирате цяло число в шестнадесетичен в SASS

Вместо нещо като структурата на картографските данни, която Крис Епщайн споменава като текуща работа за SASS, аз се опитвам за постигане на нещо подобно - картографиране на низ към съответна шестнадесетична стойност, която ще се използва за указване на уникод символ за свойството CSS content. (Опитвам се да преработя SASS код на икона на шрифт.)

В момента имам нещо елементарно като:

/*icon1  -->  \F000
  icon2  -->  \F001
  icon3  -->  \F002*/

@function u-char($name) {
    @if $name == icon1 {
        @return "000";
    } @else if $name == icon2 {
        @return "001";
    } @else if $name == icon3 {
        @return "001";
    }
}

@mixin icon-class($name) {
    ...
    content: "\f#{u-char($name)}";
    ...
}

Но всъщност се опитвам да картографирам голям брой знаци, така че този подход е труден. Надявах се да мога да направя нещо като:

@function u-char($name) {
    $i: 0;
    $itemList: item1, item2, item3;

    @each $currItem in $itemList {
        @if $name == item1 {
            @return i-to-hex-str($i);
        }
        $i: $i + 1;
    }
}

Има ли нещо, което прави и преобразува цяло число в шестнадесетичен низ в SASS? Има ли друг елегантен начин за това?


person Prembo    schedule 12.04.2013    source източник


Отговори (5)


Бих направил това:

$icons: "000", "001", "002";

@function icon($i) {
  @return "\F#{nth($icons, 1)}";
}

h1::before {
  content: icon(1);
}

Редактиране:

Ако искате да свържете дума със стойност, опитайте да използвате списък от списъци и да преминете през тях. Няма да се преструвам, че това е много ефективно, но работи. Би било хубаво, ако Sass имаше хешове.

$icons: '000' calendar, '001' inbox, '002' home

@function icon($call)
  @for $i from 1 through length($icons)
    @if $call == nth(nth($icons, $i), 2)
      @return "\F#{nth(nth($icons, $i), 1)}"

h1::before
  content: icon(calendar)
person bookcasey    schedule 12.04.2013
comment
Това, което се опитвах да постигна, беше да направя миксина по-интуитивен, като мога просто да посоча иконата, използвайки име чрез миксин. напр. font-icon(copyright); В момента миксинът изисква да посочите името и съответния уникод символ като: font-icon(calendar, "008");. - person Prembo; 12.04.2013
comment
Благодаря - отлично решение предвид ограниченията (т.е. липсата на карта/хеш). Харесва ми! - person Prembo; 12.04.2013
comment
Попаднах тук, защото търсех да преобразувам цяло число в шестнадесетичен в SASS, на което този приет отговор не дава отговор! - person Sorin GFS; 23.01.2021

Какво сте опитвали досега? Какъв тип данни използвате за съхраняване на тази дата? От мен може да е толкова просто като (date1 - date2).to_days(); или дори, използвайки C++11 и подходящ код ("2012-01-24"_date - "2013-01-08"_date).to_days();
person JPGringo    schedule 01.11.2013
comment
Благодаря за тази функция. Изненадан съм, че нещо подобно вече не е вградено в SASS. - person Prembo; 11.03.2015
comment
Този отговор е цитиран в тази заявка за функция в хранилището на SASS. - person luukvhoudt; 16.12.2017

Друго изпълнение на последния въпрос във вашата публикация: „Има ли нещо, което прави преобразуване на низове от цяло число в шестнадесетичен в SASS?“ това е най-кратката версия (не работи на най-старата версия, защото str-slice може да липсва).

@function decToHex($dec) {
    $hex: "0123456789ABCDEF";
    $first: (($dec - $dec % 16)/16)+1;
    $second: ($dec % 16)+1;
    @return str-slice($hex, $first, $first) + str-slice($hex, $second, $second)
}
person Pierpaolo Cira    schedule 27.11.2015
comment
Този отговор е цитиран в тази заявка за функция в хранилището на SASS. - person luukvhoudt; 16.12.2017

Предишните отговори не ни помогнаха, така че ето две бързи функции за преобразуване на цяло число в множество различни бази, включително шестнадесетични:

@function decimal-to-base($decimal, $to_base, $chars: '0123456789abcdefghijklmnopqrstuvwxyz')
  @if type-of($decimal) != 'number'
    @error '$decimal must be an integer.'
  @if type-of($to_base) != 'number'
    @error '$to-base must be an integer.'
  @if type-of($chars) != 'string'
    @error '$chars must be a string.'
  @if $to_base < 2
    @error '$to-base must be larger than 1.'
  @if $to_base > str-length($chars)
    @error 'Length of $chars must be equal or larger than $to-base.'
  @return _decimal-to-base($decimal, $to_base, $chars)

@function _decimal-to-base($decimal, $to_base, $chars, $_accum: '')
  @if $decimal <= 0
    @return if($_accum != '', $_accum, '0')
  $remainder: $decimal % $to_base
  $char: str-slice($chars, $remainder + 1, $remainder + 1)
  $remaining_decimal: ($decimal - $remainder) / $to_base
  @return _decimal-to-base($remaining_decimal, $to_base, $chars, $char + $_accum)

Ако не ви интересува обработката на грешки, можете да пропуснете дългата първа функция (която всъщност само валидира аргументите и задава знаците по подразбиране) и просто копирайте втората функция.

Също така имайте предвид, че това е написано на SASS, а не на SCSS. За поддръжка на SCSS ще искате да поставите няколко къдрави скоби и точка и запетая.

Примери:

  • Десетично към шестнадесетично:
    decimal-to-base(15731618, 16) // "f00ba2".

  • Десетично към двоично:
    decimal-to-base(34, 2) // "100010".

  • Времево клеймо за низ на заявка:
    decimal-to-base(1547598870, 2) // "pleb0y".

  • Определено не е морзова азбука:
    decimal-to-base(34, 2, '-.') // "-...-.".

  • Свръхразработено цяло число към низ:
    decimal-to-base(123456, 10) // "123456".

Известни предупреждения: (защото това е мръсна реализация)

  • Въведеният десетичен знак трябва да е цяло число >= 0.
  • Минималната база е 2.
  • Ще искате да внимавате с големите цели числа.
person EchoCrow    schedule 16.01.2019

Моите функции за промяна на числа напред и назад между шестнадесетични и десетични числа са

$hex-chars: "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F";

@function dec-to-hex($d) {
    $result: "";
    $rest: $d;
    @while $rest > 0 {
        $result: nth($hex-chars, $rest % 16 + 1) + $result;
        $rest: floor($rest / 16);
    }
    @return $result;
}

@function pow($number, $exponent) {
    $value: 1;
    @if $exponent > 0 {
        @for $i from 1 through $exponent {
            $value: $value * $number;
        }
    }
    @return $value;
}

@function hex-to-dec($d) {
    $result: 0;
    $number: inspect($d);
    $power: 0;
    @for $index from str-length($number) through 1 {
        $digit: str-slice($number, $index, $index);
        $value: index($hex-chars, $digit) - 1;
        $result: $result + ($value * pow(16, $power) );
        $power: $power + 1;
    }
    @return $result;
}

Десетичното число се счита за число, докато шестнадесетичното се счита за низ

person Jan Stanicek    schedule 06.05.2020