Number
is an importanttype
that we encounter a lot in everyday programming work. We run intonumber
everywhere from sizing and layout forUI
toconditional
event
.- Working with
number
is one of the main jobs that computers are created, but sometimes for people to be able to communicate with the computer,number
must be converted toformat
that humans can read and understand to ensure their integrity. precise as well as tight on request.
1 / Solving the decimal problem:
- If the request is simple, we can use a
string literal
to initialize anumber
from theString
form as follows:
1 2 3 4 | <span class="token keyword">let</span> a <span class="token operator">=</span> <span class="token function">String</span> <span class="token punctuation">(</span> <span class="token number">42</span> <span class="token punctuation">)</span> <span class="token comment">// "42"</span> <span class="token keyword">let</span> b <span class="token operator">=</span> <span class="token function">String</span> <span class="token punctuation">(</span> <span class="token number">3.14</span> <span class="token punctuation">)</span> <span class="token comment">// "3.14"</span> <span class="token keyword">let</span> c <span class="token operator">=</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> <span class="token number">42</span> <span class="token delimiter variable">)</span></span> , <span class="token interpolation"><span class="token delimiter variable">(</span> <span class="token number">3.14</span> <span class="token delimiter variable">)</span></span> "</span> <span class="token comment">// "42, 3.14"</span> |
- The method works well and is accessible and gives us complete control over the values of
number
, but to increase mobility in our intended use we may need other methods and formats when doing so. constantly changingnumber
values. - For an example we will implement a
Metric
type
that allows us to associate aDouble
type
with thename
,value
, anddescription
:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">struct</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> value <span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> name <span class="token delimiter variable">)</span></span> : <span class="token interpolation"><span class="token delimiter variable">(</span> value <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- To make a
Double
number
easier to read, we can convert it fromDouble
toString
by being able to customize the decimal position to ensure theoutput
is always consistent:
1 2 3 4 5 6 7 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formattedValue <span class="token operator">=</span> <span class="token function">String</span> <span class="token punctuation">(</span> format <span class="token punctuation">:</span> <span class="token string">"%.2f"</span> <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> name <span class="token delimiter variable">)</span></span> : <span class="token interpolation"><span class="token delimiter variable">(</span> formattedValue <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- We have a problem here when if
number
is integer then theoutput
will still display a decimal point, egnumber
42
willoutput
42.00
. - The workaround is that we will filter and remove
number
after the decimal point if they are0
as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> formattedValue <span class="token operator">=</span> <span class="token function">String</span> <span class="token punctuation">(</span> format <span class="token punctuation">:</span> <span class="token string">"%.2f"</span> <span class="token punctuation">,</span> value <span class="token punctuation">)</span> <span class="token keyword">while</span> formattedValue <span class="token punctuation">.</span> <span class="token builtin">last</span> <span class="token operator">==</span> <span class="token string">"0"</span> <span class="token punctuation">{</span> formattedValue <span class="token punctuation">.</span> <span class="token function">removeLast</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> formattedValue <span class="token punctuation">.</span> <span class="token builtin">last</span> <span class="token operator">==</span> <span class="token string">"."</span> <span class="token punctuation">{</span> formattedValue <span class="token punctuation">.</span> <span class="token function">removeLast</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> name <span class="token delimiter variable">)</span></span> : <span class="token interpolation"><span class="token delimiter variable">(</span> formattedValue <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- The above
code
works fine but not very neat and this is not an approach for all use cases, since in different languages there will be different methods of representingnumber
and we It is impossible to just handle individual cases for each language.
2 / Using NumberFormatter:
- Using
NumberFormatter
inFoundation
to solve the above problem ofnumber
after decimals likeDateFormatter
formattingDate
values is a better choice becauseNumberFormatter
has provided us with all the necessary tools for us to do. work withnumber
. - With
NumberFormatter
we can work with eachnumber
with decimals or without decimals and display the exactnumber
to each number after the decimal point we want like42
,42.1
,42.22
:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> formatter <span class="token punctuation">.</span> numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span> decimal formatter <span class="token punctuation">.</span> maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span> <span class="token punctuation">(</span> value <span class="token punctuation">:</span> value <span class="token punctuation">)</span> <span class="token keyword">let</span> formattedValue <span class="token operator">=</span> formatter <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> from <span class="token punctuation">:</span> number <span class="token punctuation">)</span> <span class="token operator">!</span> <span class="token keyword">return</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> name <span class="token delimiter variable">)</span></span> : <span class="token interpolation"><span class="token delimiter variable">(</span> formattedValue <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- Another benefit we get when using
NumberFormatter
is that it will automatically use theLocale
we are using for formatting. For example, in some countries thenumber
69969.69
will be formatted as69 969,69
instead of69,969.69
. The above complicated cases can all be handled easily and automatically. - Not in all cases we can use
Locale
, we need to further customize thedecimalSeparator
andgroupingSeparator
as follows:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> formatter <span class="token punctuation">.</span> numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span> decimal formatter <span class="token punctuation">.</span> maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> formatter <span class="token punctuation">.</span> decimalSeparator <span class="token operator">=</span> <span class="token string">"."</span> formatter <span class="token punctuation">.</span> groupingSeparator <span class="token operator">=</span> <span class="token string">""</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- In this case we want our
formatting
formats to conform to each region in use. We need to create additionalstatic
property
so we can reuse theMetric
value
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">extension</span> <span class="token builtin">Metric</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">var</span> valueFormatter <span class="token punctuation">:</span> <span class="token builtin">NumberFormatter</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> formatter <span class="token punctuation">.</span> numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span> decimal formatter <span class="token punctuation">.</span> maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">return</span> formatter <span class="token punctuation">}</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">var</span> formattedValue <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span> <span class="token punctuation">(</span> value <span class="token punctuation">:</span> value <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token keyword">Self</span> <span class="token punctuation">.</span> valueFormatter <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> from <span class="token punctuation">:</span> number <span class="token punctuation">)</span> <span class="token operator">!</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token string">" <span class="token interpolation"><span class="token delimiter variable">(</span> name <span class="token delimiter variable">)</span></span> : <span class="token interpolation"><span class="token delimiter variable">(</span> formattedValue <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
3 / Domain-specific numbers:
- Depending on the type of
app
we are working with, we will have a chance to deal withdomain-specific
. In that case we would need to includenumber
‘sdescription
rather than just itsvalue
: - We work with the
shopping app
and we useDouble
to represent thePrice
struct
to describe product prices:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">struct</span> <span class="token builtin">Product</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price <span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token keyword">struct</span> <span class="token builtin">Price</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> amount <span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token keyword">var</span> currency <span class="token punctuation">:</span> <span class="token builtin">Currency</span> <span class="token punctuation">}</span> <span class="token keyword">enum</span> <span class="token builtin">Currency</span> <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">,</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> eur <span class="token keyword">case</span> usd <span class="token keyword">case</span> sek <span class="token keyword">case</span> pln <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- The question is how can we format the
Price
instance
for eachuser
in different country with differentLocale
: - This is a case where
NumberFormatter
proved extremely useful includingfull-support
forLocale
as well as the ability to customizenumberStyle
andcurrency
as follows
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">extension</span> <span class="token builtin">Price</span> <span class="token punctuation">:</span> <span class="token builtin">CustomStringConvertible</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> description <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">NumberFormatter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> formatter <span class="token punctuation">.</span> numberStyle <span class="token operator">=</span> <span class="token punctuation">.</span> currency formatter <span class="token punctuation">.</span> currencyCode <span class="token operator">=</span> currency <span class="token punctuation">.</span> rawValue formatter <span class="token punctuation">.</span> maximumFractionDigits <span class="token operator">=</span> <span class="token number">2</span> <span class="token keyword">let</span> number <span class="token operator">=</span> <span class="token function">NSNumber</span> <span class="token punctuation">(</span> value <span class="token punctuation">:</span> amount <span class="token punctuation">)</span> <span class="token keyword">return</span> formatter <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> from <span class="token punctuation">:</span> number <span class="token punctuation">)</span> <span class="token operator">!</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- The result we get here will be the pricing for each country using different
Locale
, for exampleprice
3.14
in Sweden usingSEK
currency will be displayed as follows- Sweden :
3,14 kr
- Spain :
3.14 SEK
- US :
SEK 3.14
- France :
SEK 3,14
- Sweden :
- Besides
price
we often encounter the case ofnumber
values displayed according to measurement parameters. For example, we want to focus on the top speed achieved by a car liketopSpeed
:
1 2 3 4 5 6 7 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price <span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token keyword">var</span> topSpeed <span class="token punctuation">:</span> <span class="token builtin">Double</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- In this case, to accurately
topSpeed
,Double
not the optimal choice but instead we can always useMeasurement
with aphantom type
UnitSpeed
:
1 2 3 4 5 6 7 8 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price <span class="token punctuation">:</span> <span class="token builtin">Price</span> <span class="token keyword">var</span> topSpeed <span class="token punctuation">:</span> <span class="token builtin">Measurement</span> <span class="token operator"><</span> <span class="token builtin">UnitSpeed</span> <span class="token operator">></span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- While instantiating the
Vehicle
instance
we may have to specify a unit of measure fortopSpeed
to avoid ambiguity. BecauseMeasurement
has a built-informatter
, we can easily handle this problem:
1 2 3 4 5 6 7 | <span class="token keyword">extension</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> formattedTopSpeed <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> formatter <span class="token operator">=</span> <span class="token function">MeasurementFormatter</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> formatter <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> from <span class="token punctuation">:</span> topSpeed <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- We need to keep in mind that when constructing
Measurement
we will be simultaneously usingencoded
anddecoded
so we will needCodeable
toMeasurement
to ensure when our values are not inJSON
that we candownload
from theapp server
. In this case we’ll need to add the unified units of measure for thedecoded
process to work properly:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <span class="token keyword">extension</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">enum</span> <span class="token builtin">CodingKeys</span> <span class="token punctuation">:</span> <span class="token builtin">CodingKey</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> name <span class="token punctuation">,</span> price <span class="token punctuation">,</span> topSpeed <span class="token punctuation">,</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token keyword">init</span> <span class="token punctuation">(</span> from decoder <span class="token punctuation">:</span> <span class="token builtin">Decoder</span> <span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> container <span class="token operator">=</span> <span class="token keyword">try</span> decoder <span class="token punctuation">.</span> <span class="token function">container</span> <span class="token punctuation">(</span> keyedBy <span class="token punctuation">:</span> <span class="token builtin">CodingKeys</span> <span class="token punctuation">.</span> <span class="token keyword">self</span> <span class="token punctuation">)</span> <span class="token comment">// Decoding all other properties</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> topSpeed <span class="token operator">=</span> <span class="token keyword">try</span> <span class="token function">Measurement</span> <span class="token punctuation">(</span> value <span class="token punctuation">:</span> container <span class="token punctuation">.</span> <span class="token function">decode</span> <span class="token punctuation">(</span> <span class="token builtin">Double</span> <span class="token punctuation">.</span> <span class="token keyword">self</span> <span class="token punctuation">,</span> forKey <span class="token punctuation">:</span> <span class="token punctuation">.</span> topSpeed <span class="token punctuation">)</span> <span class="token punctuation">,</span> unit <span class="token punctuation">:</span> <span class="token punctuation">.</span> kilometersPerHour <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// Encoding implementation</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- We can now use
property wrapper
to encapsulate the conversion betweenDouble
andMeasurement
with a singletype
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @propertyWrapper <span class="token keyword">struct</span> <span class="token builtin">KilometersPerHour</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> wrappedValue <span class="token punctuation">:</span> <span class="token builtin">Measurement</span> <span class="token operator"><</span> <span class="token builtin">UnitSpeed</span> <span class="token operator">></span> <span class="token punctuation">}</span> <span class="token keyword">extension</span> <span class="token builtin">KilometersPerHour</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">init</span> <span class="token punctuation">(</span> from decoder <span class="token punctuation">:</span> <span class="token builtin">Decoder</span> <span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> container <span class="token operator">=</span> <span class="token keyword">try</span> decoder <span class="token punctuation">.</span> <span class="token function">singleValueContainer</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">let</span> rawValue <span class="token operator">=</span> <span class="token keyword">try</span> container <span class="token punctuation">.</span> <span class="token function">decode</span> <span class="token punctuation">(</span> <span class="token builtin">Double</span> <span class="token punctuation">.</span> <span class="token keyword">self</span> <span class="token punctuation">)</span> wrappedValue <span class="token operator">=</span> <span class="token function">Measurement</span> <span class="token punctuation">(</span> value <span class="token punctuation">:</span> rawValue <span class="token punctuation">,</span> unit <span class="token punctuation">:</span> <span class="token punctuation">.</span> kilometersPerHour <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">encode</span> <span class="token punctuation">(</span> to encoder <span class="token punctuation">:</span> <span class="token builtin">Encoder</span> <span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> container <span class="token operator">=</span> encoder <span class="token punctuation">.</span> <span class="token function">singleValueContainer</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">try</span> container <span class="token punctuation">.</span> <span class="token function">encode</span> <span class="token punctuation">(</span> wrappedValue <span class="token punctuation">.</span> value <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
- When ever we collect or benefit them we can now mark the
topSpeed
property
with@KilometersPerHour
:
1 2 3 4 5 6 7 | <span class="token keyword">struct</span> <span class="token builtin">Vehicle</span> <span class="token punctuation">:</span> <span class="token builtin">Codable</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> name <span class="token punctuation">:</span> <span class="token builtin">String</span> <span class="token keyword">var</span> price <span class="token punctuation">:</span> <span class="token builtin">Price</span> @ <span class="token builtin">KilometersPerHour</span> <span class="token keyword">var</span> topSpeed <span class="token punctuation">:</span> <span class="token builtin">Measurement</span> <span class="token operator"><</span> <span class="token builtin">UnitSpeed</span> <span class="token operator">></span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">}</span> |
- We have now secured a safe and efficient use of
Measurement
from the above implementation for the proper formatting and conversion for the features we need when developingapp
whenencoding
anddecoding
data model
.