Elettracompany.com

Компьютерный справочник
8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Character digit java

Character.digit () в Java с примерами

Java.lang.Character.digit () — это встроенный метод в java, который возвращает числовое значение символа ch в указанном основании. Возвращает -1, если основание находится вне диапазона MIN_RADIX или если значение ch не является действительной цифрой в указанном показателе. Символ является действительной цифрой, если хотя бы одно из следующих значений верно:

  • Метод isDigit имеет значение true для символа, и значение десятичной цифры Unicode символа (или его разложение на один символ) меньше указанного радиуса. В этом случае возвращается десятичное число.
  • Символ является одной из заглавных латинских букв от «A» до «Z», и его код меньше чем radix + «A» — 10. В этом случае возвращается ch — «A» + 10.
  • Символ является одной из строчных латинских букв от «а» до «z», и его код меньше чем radix + «a» — 10. В этом случае возвращается ch — «a» + 10.
  • Символ является одной из заглавных букв латинского алфавита полной ширины от A (‘/ uFF21’) до Z (‘/ uFF3A’), и его код меньше, чем radix + ‘/ uFF21’ — 10. В этом случае ch — ‘/ uFF21’ + 10 возвращается.
  • Символ является одной из строчных букв латинского алфавита полной ширины от a (‘/ uFF41’) до z (‘/ uFF5A’), и его код меньше чем radix + ‘/ uFF41’ — 10. В этом случае ch — ‘/ uFF41’ + 10 возвращается.

Синтаксис:

Параметры: функция принимает два параметра, которые описаны ниже:

  • ch- Это обязательный параметр, который указывает символ для преобразования.
  • radix — это обязательный параметр, который определяет radix.

Возвращаемое значение: Этот метод возвращает числовое значение, представленное символом в указанном основании.

Ниже программы демонстрирует вышеуказанный метод:

Программа 1:

// Java-программа для иллюстрации
// Character.digit () метод

public class gfg <

public static void main(String[] args)

// создать и присвоить значение

// до 2-х символьных объектов

char c1 = ‘3’ , c2 = ‘6’ ;

// присваиваем числовое значение c1 in1, используя radix

int in1 = Character.digit(c1, 5 );

System.out.println( «Numeric value of » + c1 + » in radix 5 is » + in1);

// присваиваем числовое значение c2 in2, используя radix

int in2 = Character.digit(c2, 15 );

System.out.println( «Numeric value of » + c2 + » in radix 15 is » + in2);

Программа 2:

// Java-программа для иллюстрации
// Character.digit () метод
// когда возвращается -1

public class gfg <

public static void main(String[] args)

// создать и присвоить значение

// до 2-х символьных объектов

char c1 = ‘a’ , c2 = ‘z’ ;

// присваиваем числовое значение c1 in1, используя radix

int in1 = Character.digit(c1, 5 );

System.out.println( «Numeric value of » + c1 + » in radix 5 is » + in1);

// присваиваем числовое значение c2 in2, используя radix

Дженерики (Java, обучающая статья)

Предисловие

За основу данной статьи была взята информация из 6-ой главы книги «Oracle Certified Professional Java SE 7 Programmers Exams 1Z0-804 and 1Z0-805». Она была немного изменена (кое-где обрезана, а кое-где дополнена с помощью Google и Википедии). Здесь показаны далеко не все нюансы дженериков — для более подробной информации следует обратиться к официальной документации. Приятного прочтения.

Введение

Обобщённое программирование — это такой подход к описанию данных и алгоритмов, который позволяет их использовать с различными типами данных без изменения их описания. В Java, начиная с версии J2SE 5.0, добавлены средства обобщённого программирования, синтаксически основанные на C++. Ниже будут рассматриваться generics (дженерики) или > — подмножество обобщённого программирования.

Допустим мы ничего не знаем о дженериках и нам необходимо реализовать специфический вывод на консоль информации об объектах различного типа (с использованием фигурных скобок).

Ниже пример реализации:

В вышеприведённом коде была допущена ошибка, из-за которой на консоли мы увидим следующее:

Теперь на время забудем об этом примере и попробуем реализовать тот же функционал с использованием дженериков (и повторим ту же ошибку):

Самое существенное отличие (для меня) в том, что при ошибке, аналогичной предыдущей, проблемный код не скомпилируется:

Думаю, многие согласятся, что ошибка компиляции «лучше» ошибки времени выполнения, т.к. чисто теоретически скомпилированный код с ошибкой может попасть туда, куда ему лучше бы и не попадать. Это очевидное достоинство дженериков. Теперь подробнее рассмотрим конструкции, относящиеся к дженерикам в этом примере. Для того, чтобы код скомпилировался, достаточно заменить строку

Посмотрим на декларацию BoxPrinter:

После имени класса в угловых скобках » » указано имя типа «Т», которое может использоваться внутри класса. Фактически Т – это тип, который должен быть определён позже (при создании объекта класса).

Внутри класса первое использование T в объявлении поля:

Здесь объявляется переменная дженерик-типа (generic type), т.о. её тип будет указан позже, при создании объекта класса BoxPrinter.

В main()-методе происходит следующее объявление:

Здесь указывается, что Т имеет тип Integer. Грубо говоря, для объекта value1 все поля Т-типа его класса BoxPrinter становятся полями типа Integer (private Integer val;).
Ещё одно место, где используется T:

Как и в декларации val с типом Т, вы говорите, что аргумент для конструктора BoxPrinter имеет тип T. Позже в main()-методе, когда будет вызван конструктор в new, указывается, что Т имеет тип Integer:

Теперь, внутри конструктора BoxPrinter, arg и val должны быть одного типа, так как оба имеют тип T. Например следующее изменение конструктора:

приведёт к ошибке компиляции.

Последнее место использования Т в классе – метод getValue():

Тут вроде тоже всё ясно – этот метод для соответствующего объекта будет возвращать значение того типа, который будет задан при его (объекта) создании.

При создании дженерик-классов мы не ограничены одним лишь типом (Т) – их может быть несколько:

Нет ограничений и на количество переменных с использующих такой тип:

Алмазный синтаксис (Diamond syntax)

Вернёмся немного назад к примеру со строкой кода:

Если типы не будут совпадать:

То мы получим ошибку при компиляции:

Немного лениво каждый раз заполнять типы и при этом можно ошибиться. Чтобы упростить жизнь программистам в Java 7 был введён алмазный синтаксис (diamond syntax), в котором можно опустить параметры типа. Т.е. можно предоставить компилятору определение типов при создании объекта. Вид упрощённого объявления:

Следует обратить внимание, что возможны ошибки связанные с отсутствием «<>» при использовании алмазного синтаксиса

В случае с примером кода выше мы просто получим предупреждение от компилятора, Поскольку Pair является дженерик-типом и были забыты «<>» или явное задание параметров, компилятор рассматривает его в качестве простого типа (raw type) с Pair принимающим два параметра типа объекта. Хотя такое поведение не вызывает никаких проблем в данном сегменте кода, это может привести к ошибке. Здесь необходимо пояснение понятия простого типа.

Посмотрим на вот этот фрагмент кода:

Читать еще:  Java jdk 9

Теперь посмотрим на вот этот:

По результатам выполнения оба фрагмента аналогичны, но у них разная идея. В первом случае мы имеем место с простым типом, во вторым – с дженериком. Теперь сломаем это дело – заменим в обоих случаях

Для простого типа получим ошибку времени выполнения (java.lang.ClassCastException), а для второго – ошибку компиляции. В общем, это очень похоже на 2 самых первых примера. Если в двух словах, то при использовании простых типов, вы теряете преимущество безопасности типов, предоставляемое дженериками.

Универсальные методы (Generic methods)

По аналогии с универсальными классами (дженерик-классами), можно создавать универсальные методы (дженерик-методы), то есть методы, которые принимают общие типы параметров. Универсальные методы не надо путать с методами в дженерик-классе. Универсальные методы удобны, когда одна и та же функциональность должна применяться к различным типам. (Например, есть многочисленные общие методы в классе java.util.Collections.)

Рассмотрим реализацию такого метода:

Нам в первую очередь интересно это:

» » размещено после ключевых слов «public» и «static», а затем следуют тип возвращаемого значения, имя метода и его параметры. Такое объявление отлично от объявления универсальных классов, где универсальный параметр указывается после имени класса. Тело метода вполне обычное – в цикле все элементы списка устанавливаются в одно значение (val). Ну и в main()-методе происходит вызов нашего универсального метода:

Стоит обратить внимание на то, что здесь не задан явно тип параметра. Для IntList – это Integer и 100 тоже упаковывается в Integer. Компилятор ставит в соответствие типу Т – Integer.

Возможны ошибки, связанные с импортом List из java.awt вместо java.util. Важно помнить, что список из java.util является универсальным типом а список из java.awt — нет.

А сейчас вопрос – какая (-ие) из нижеприведённых строк откомпилируется без проблем?

Перед ответом на этот вопрос следует учесть, что List – интерфейс, ArrayList наследуется от List; Number — абстрактный класс и Integer наследуется от Number.

Ответ с пояснением:
Первый вариант неправильный, т.к. нельзя создавать объект интерфейса.
Во втором случае мы создаем объект типа ArrayList и ссылку на него базового для ArrayList класса. И там, и там дженерик-тип одинаковый – всё правильно.
В третьем и четвёртом случае будет иметь ошибка компиляции, т.к. дженерик-типы должны быть одинаковыми (связи наследования здесь никак не учитываются).

Условие одинаковости дженерик-типов может показаться не совсем логичным. В частности хотелось бы использовать конструкцию под номером 3. Почему же это не допускается?

Будем думать от обратного – допустим 3-ий вариант возможен. Рассмотрим такой код:

Первая строка кода смотрится вполне логично, т.к. ArrayList наследуется от List , а Integer наследуется от Number. Однако допуская такую возможность мы получили бы ошибку в третьей строке этого кода, ведь динамический тип IntList — ArrayList , т.е. происходит нарушение типобезапасности (присвоение значение Float там, где ожидается Integer) и в итоге была бы получена ошибка компилятора. Дженерики созданы, чтобы избегать ошибок такого рода, поэтому существует данное ограничение. Но тем не менее это неудобное ограничение и Java поддерживает маски для его обхода.

Wildcards (Маски)

Сейчас будут рассмотрены Wildcard Parameters (wildcards). Этот термин в разных источниках переводится по-разному: метасимвольные аргументы, подстановочные символы, групповые символы, шаблоны, маски и т.д. В данной статье я буду использовать «маску», просто потому, что в ней меньше букв…

Как было написано выше вот такая строка кода не скомпилируется:

Но есть возможность похожей реализации:

Под маской мы будем понимать вот эту штуку – » «.

А сейчас пример кода использующего маску и пригодного к компиляции:

Метод printList принимает список, для которого в сигнатуре использована маска:

И этот метод работает для списков с различными типами данных (в примере Integer и String).

Однако вот это не скомпилируется:

Почему не компилируется? При использовании маски мы сообщаем компилятору, чтобы он игнорировал информацию о типе, т.е. — неизвестный тип. При каждой попытке передачи аргументов дженерик-типа компилятор Java пытается определить тип переданного аргумента. Однако теперь мы используем метод add () для вставки элемента в список. При использовании маски мы не знаем, какого типа аргумент может быть передан. Тут вновь видна возможность ошибки, т.к. если бы добавление было возможно, то мы могли бы попытаться вставить в наш список, предназначенный для чисел, строковое значение. Во избежание этой проблемы, компилятор не позволяет вызывать методы, которые могут добавить невалидный тип — например, добавить значение типа Float, с которым мы потом попробуем работать как с Integer (или String — по маске не определишь точно). Тем не менее есть возможность получить доступ к информации, хранящейся в объекте, с использованием маски, как это было показано выше.

И ещё один маленький пример:

Тут не возникнет проблем компиляции. Однако нехорошо, что переменная numList хранит список со строками. Допустим нам нужно так объявить эту переменную, чтобы она хранила только списки чисел. Решение есть:

Данный код не скомпилируется, а всё из-за того, что с помощью маски мы задали ограничение. Переменная numList может хранить ссылку только на список, содержащий элементы унаследованные от Number, а всё из-за объявления: List numList. Тут мы видим, как маске задаётся ограничение – теперь numList предназначен для списка с ограниченным количеством типов. Double как и Integer наследуется от Number, поэтому код приведённый ниже скомпилируется.

То, что было описано выше называется ограниченными масками (Bounded wildcards). Применение таких конструкций может быть весьма красивым и полезным. Допустим нам необходимо посчитать сумму чисел различного типа, которые хранятся в одном списке:

Double-тип был использован для переменной result т.к. он без проблем взаимодействует с другими числовыми типами (т.е. не будет проблем с приведением типов).

В завершение этой темы добавлю, что аналогично ключевому слову extends в подобного рода выражениях может использоваться ключевое слово super — » «. Выражение означает, что вы можете использовать любой базовый тип (класс или интерфейс) типа Х, а также и сам тип Х. Пара строк, которые нормально скомпилируются:

На этом все. Надеюсь, данная статья была полезной.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 170 Голосовать

Java Data Types

Java Data Types

As explained in the previous chapter, a variable in Java must be a specified data type:

Example

Data types are divided into two groups:

  • Primitive data types — includes byte , short , int , long , float , double , boolean and char
  • Non-primitive data types — such as String, Arrays and Classes (you will learn more about these in a later chapter)

Primitive Data Types

A primitive data type specifies the size and type of variable values, and it has no additional methods.

Читать еще:  Класс timer java

There are eight primitive data types in Java:

Numbers

Primitive number types are divided into two groups:

Integer types stores whole numbers, positive or negative (such as 123 or -456), without decimals. Valid types are byte , short , int and long . Which type you should use, depends on the numeric value.

Floating point types represents numbers with a fractional part, containing one or more decimals. There are two types: float and double .

Even though there are many numeric types in Java, the most used for numbers are int (for whole numbers) and double (for floating point numbers). However, we will describe them all as you continue to read.

Integer Types

The byte data type can store whole numbers from -128 to 127. This can be used instead of int or other integer types to save memory when you are certain that the value will be within -128 and 127:

Example

Short

The short data type can store whole numbers from -32768 to 32767:

Example

The int data type can store whole numbers from -2147483648 to 2147483647. In general, and in our tutorial, the int data type is the preferred data type when we create variables with a numeric value.

Example

The long data type can store whole numbers from -9223372036854775808 to 9223372036854775807. This is used when int is not large enough to store the value. Note that you should end the value with an «L»:

Example

Floating Point Types

You should use a floating point type whenever you need a number with a decimal, such as 9.99 or 3.14515.

Float

The float data type can store fractional numbers from 3.4e−038 to 3.4e+038. Note that you should end the value with an «f»:

Example

Double

The double data type can store fractional numbers from 1.7e−308 to 1.7e+308. Note that you should end the value with a «d»:

Example

Use float or double ?

The precision of a floating point value indicates how many digits the value can have after the decimal point. The precision of float is only six or seven decimal digits, while double variables have a precision of about 15 digits. Therefore it is safer to use double for most calculations.

Scientific Numbers

A floating point number can also be a scientific number with an «e» to indicate the power of 10:

Example

Booleans

A boolean data type is declared with the boolean keyword and can only take the values true or false :

Example

Boolean values are mostly used for conditional testing, which you will learn more about in a later chapter.

Characters

The char data type is used to store a single character. The character must be surrounded by single quotes, like ‘A’ or ‘c’:

Example

Alternatively, you can use ASCII values to display certain characters:

Example

Tip: A list of all ASCII values can be found in our ASCII Table Reference.

Strings

The String data type is used to store a sequence of characters (text). String values must be surrounded by double quotes:

Example

The String type is so much used and integrated in Java, that some call it «the special ninth type».

A String in Java is actually a non-primitive data type, because it refers to an object. The String object has methods that is used to perform certain operations on strings. Don’t worry if you don’t understand the term «object» just yet. We will learn more about strings and objects in a later chapter.

Non-Primitive Data Types

Non-primitive data types are called reference types because they refer to objects.

The main difference between primitive and non-primitive data types are:

  • Primitive types are predefined (already defined) in Java. Non-primitive types are created by the programmer and is not defined by Java (except for String ).
  • Non-primitive types can be used to call methods to perform certain operations, while primitive types cannot.
  • A primitive type has always a value, while non-primitive types can be null .
  • A primitive type starts with a lowercase letter, while non-primitive types starts with an uppercase letter.
  • The size of a primitive type depends on the data type, while non-primitive types have all the same size.

Examples of non-primitive types are Strings, Arrays, Classes, Interface, etc. You will learn more about these in a later chapter.

Shorthand Character Classes

Since certain character classes are used often, a series of shorthand character classes are available. d is short for [ 0 — 9 ] . In most flavors that support Unicode, d includes all digits from all scripts. Notable exceptions are Java, JavaScript, and PCRE. These Unicode flavors match only ASCII digits with d .

w stands for “word character”. It always matches the ASCII characters [ A — Z a — z 0 — 9 _ ] . Notice the inclusion of the underscore and digits. In most flavors that support Unicode, w includes many characters from other scripts. There is a lot of inconsistency about which characters are actually included. Letters and digits from alphabetic scripts and ideographs are generally included. Connector punctuation other than the underscore and numeric symbols that aren’t digits may or may not be included. XML Schema and XPath even include all symbols in w . Again, Java, JavaScript, and PCRE match only ASCII characters with w .

s stands for “whitespace character”. Again, which characters this actually includes, depends on the regex flavor. In all flavors discussed in this tutorial, it includes [ t r n f ] . That is: s matches a space, a tab, a carriage return, a line feed, or a form feed. Most flavors also include the vertical tab, with Perl (prior to version 5.18) and PCRE (prior to version 8.34) being notable exceptions. In flavors that support Unicode, s normally includes all characters from the Unicode “separator” category. Java and PCRE are exceptions once again. But JavaScript does match all Unicode whitespace with s .

Shorthand character classes can be used both inside and outside the square brackets. s d matches a whitespace character followed by a digit. [ s d ] matches a single character that is either whitespace or a digit. When applied to 1 + 2 = 3 , the former regex matches 2 (space two), while the latter matches 1 (one). [ d a — f A — F ] matches a hexadecimal digit, and is equivalent to [ 0 — 9 a — f A — F ] if your flavor only matches ASCII characters with d .

Negated Shorthand Character Classes

The above three shorthands also have negated versions. D is the same as [ ^ d ] , W is short for [ ^ w ] and S is the equivalent of [ ^ s ] .

Читать еще:  Эта переменная не определена mathcad ошибка

Be careful when using the negated shorthands inside square brackets. [ D S ] is not the same as [ ^ d s ] . The latter matches any character that is neither a digit nor whitespace. It matches x , but not 8 . The former, however, matches any character that is either not a digit, or is not whitespace. Because all digits are not whitespace, and all whitespace characters are not digits, [ D S ] matches any character; digit, whitespace, or otherwise.

More Shorthand Character Classes

While support for d , s , and w is quite universal, there are some regex flavors that support additional shorthand character classes. Perl 5.10 introduced h and v . h matches horizontal whitespace, which includes the tab and all characters in the “space separator” Unicode category. It is the same as [ t p ] . v matches “vertical whitespace”, which includes all characters treated as line breaks in the Unicode standard. It is the same as [ n cK f r x85 x <2028>x <2029>] .

PCRE also supports h and v starting with version 7.2. PHP does as of version 5.2.2, Java as of version 8, and the JGsoft engine as of version 2. Boost supports h starting with version 1.42. No version of Boost supports v as a shorthand.

In many other regex flavors, v matches only the vertical tab character. Perl, PCRE, and PHP never supported this, so they were free to give v a different meaning. Java 4 to 7 and JGsoft V1 did use v to match only the vertical tab. Java 8 and JGsoft V2 changed the meaning of this token anyway. The vertical tab is also a vertical whitespace character. To avoid confusion, the above paragraph uses cK to represent the vertical tab.

Ruby 1.9 and later have their own version of h . It matches a single hexadecimal digit just like [ 0 — 9 a — f A — F ] . v is a vertical tab in Ruby.

XML Character Classes

XML Schema, XPath, and JGsoft V2 regular expressions support four more shorthands that aren’t supported by any other regular expression flavors. i matches any character that may be the first character of an XML name. c matches any character that may occur after the first character in an XML name. I and C are the respective negated shorthands. Note that the c shorthand syntax conflicts with the control character syntax used in many other regex flavors.

You can use these four shorthands both inside and outside character classes using the bracket notation. They’re very useful for validating XML references and values in your XML schemas. The regular expression i c * matches an XML name like xml:schema .

The regex matches an opening XML tag without any attributes. matches any closing tag. matches an opening tag with any number of attributes. Putting it all together, matches either an opening tag with attributes or a closing tag.

No other regex flavors discussed in this tutorial support XML character classes. If your XML files are plain ASCII , you can use [ _: A — Z a — z ] for i and [ -._: A — Z a — z 0 — 9 ] for c . If you want to allow all Unicode characters that the XML standard allows, then you will end up with some pretty long regexes. You would have to use [ : A — Z _ a — z u00C0 — u00D6 u00D8 — u00F6 u00F8 — u02FF u0370 — u037D u037F — u1FFF u200C — u200D
u2070 — u218F u2C00 — u2FEF u3001 — uD7FF uF900 — uFDCF uFDF0 — uFFFD ] instead of i and [ -. 0 — 9 : A — Z _ a — z u00B7 u00C0 — u00D6 u00D8 — u00F6 u00F8 — u037D u037F — u1FFF u200C — u200D
u203F u2040 u2070 — u218F u2C00 — u2FEF u3001 — uD7FF uF900 — uFDCF uFDF0 — uFFFD ] instead of c .

Make a Donation

Did this website just save you a trip to the bookstore? Please make a donation to support this site, and you’ll get a lifetime of advertisement-free access to this site!

Character digit java

Кроме того, этот класс обеспечивает несколько методов для того, чтобы они определили категорию символа (строчная буква, цифра, и т.д.) и для того, чтобы преобразовать символы от верхнего регистра до нижнего регистра и наоборот.

Символьная информация основана на Стандарте Unicode, версии 6.0.0.

Методы и данные класса Character определяются информацией в файле UnicodeData, который является частью Базы данных Символа Unicode, сохраняемой Консорциумом Unicode. Этот файл определяет различные свойства включая имя и общую категорию для каждой определенной кодовой точки Unicode или диапазона символов.

Файл и его описание доступны от Консорциума Unicode в:

  • http://www.unicode.org

Представления Символа Unicode

char тип данных (и поэтому значение это a Character объект инкапсулирует), основаны на исходной спецификации Unicode, которая определила символы как фиксированную ширину 16-разрядные объекты. Стандарт Unicode был с тех пор изменен, чтобы учесть символы, представление которых требует больше чем 16 битов. Диапазоном точек свода законов является теперь U+0000 к U+10FFFF, известному как скалярное значение Unicode. (Сошлитесь на определение нотации U+n в Стандарте Unicode.)

Набор символов от U+0000 до U+FFFF иногда упоминается как Основная Многоязычная Плоскость (BMP). Символы, кодовые точки которых больше чем U+FFFF, вызывают дополнительными символами. Платформа Java использует представление UTF-16 в char массивы и в String и StringBuffer классы. В этом представлении дополнительные символы представляются как пара char значения, первое от диапазона высоких заместителей, (uD800-uDBFF), второго от диапазона низких заместителей (uDC00-uDFFF).

A char значение, поэтому, представляет Основную Многоязычную Плоскость (BMP) кодовые точки, включая суррогатные кодовые точки, или элементы кода кодирования UTF-16. int значение представляет все кодовые точки Unicode, включая дополнительные кодовые точки. Ниже (младший значащий) 21 бит int используются, чтобы представить кодовые точки Unicode, и верхние (старшие значащие) 11 битов должны быть нулем. Если иначе не определено, поведение относительно дополнительных символов и заместителя char значения следующие:

  • Методы, которые только принимают a char значение не может поддерживать дополнительные символы. Они обрабатывают char значения от заместителя располагаются как неопределенные символы. Например, Character.isLetter(‘uD840’) возвраты false , даже при том, что это определенное значение если бы сопровождающийся любым значением низкого заместителя в строке представило бы букву.
  • Методы, которые принимают int оцените поддерживают все символы Unicode, включая дополнительные символы. Например, Character.isLetter(0x2F81A) возвраты true потому что значение кодовой точки представляет букву (идеограмма CJK).

В Java документация API SE кодовая точка Unicode используется для символьных значений в диапазоне между U+0000 и U+10FFFF, и элемент кода Unicode используется для 16-разрядного char значения, которые являются элементами кода кодирования UTF-16. Для получения дополнительной информации по терминологии Unicode сошлитесь на Глоссарий Unicode .

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×