Let's abbreviate those numbers! Now reverse? Introduction:

Like Twitter and Instagram and others, I wanted to display numbers like 1.2K and 3.8 M instead of 1,222 or 3,823,456.

But that's not all! As we all know, there might be some human beings which undoubtely won't like these abbreviations and will try to reverse them. So, 1.2k will become 1,200 and 3.8 M will become 3,800,000.

The task:


your task is to write a program or a function that converts a list of numbers (which are given as strings) into their abbreviate pairs and vice-versa. 


For example, if the input list (or any STDIN) was ['1.4k', '1,234,567', '7.99M'], then you should output:

['1,400', '1.2M', '7,990,000']


You can follow the next schema for abbreviations:


103 -> one kilo -> K
106 -> one million -> M
109 -> one billion -> B


Your code may assume all lowercase, all uppercase, mixed case or undefined case for input and use any of these for output, but should be consistent.

Rules and restrictions:


you may write a program or function, taking input via STDIN (or closest alternative), command-line argument or function argument and outputting the result via STDOUT (or closest alternative), function return value or function (out) parameter.
input may be in any convenient list or string format. You may assume that the ai are less than 231 each and that the list contains at least one element.
each abbreviated number will contain only one . while a normal number will contain as many , as necessary (you may assume that this numbers won't be altered). 
you MAY NOT enter a number as '123456' but rather 123,456 
standard code-golf rules apply.


Test cases:

Input: ['1.5M', '77.6k', '123,456,789']         Output: ['1,500,000', '77,600', '123.4M']
Input: ['3,000,000,000', '581k', '2b']          Output: ['3B', '581,000', '2,000,000,000']
Input: ['0.1k']                                 Output: ['100']
Input: ['888', '33']                            Output: ['0.888k', '0.033k']


Clarifications:


for numbers &lt; 1000 after the decimal point in abbreviation output you should have as many digits as required to get the correct result. (e.g: 2 -> will become 0.002k) - that means 3 decimals at most; for numbers > 1000 you can have a maximum of 1 decimal.
the abbreviation may be in both lower or upper case
I removed the built-ins restriction as suggested in the comments


The shortest code in bytes wins!
PHP, 234 224 213 201 205 bytes
for(;$x=$argv[++$n];){$y=str_replace(&quot;,&quot;,&quot;&quot;,$x)/1e3;for($i=0;$y&gt;999;$i++)$y=($y|0)/1e3;echo(A&lt;$c=substr($x,strlen($x)-1))?number_format($x*[k=&gt;1e3,m=&gt;1e6,b=&gt;1e9][$c]):($i?($y*10|0)/10:$y).kmb[$i],&quot; &quot;;}

6 bytes saved by insertusernamehere, 4 bytes inspired by that.


takes input from command line arguments, prints results space-separated with a trailing separator
expects lower case abbreviation
run with -r

-2 bytes if underscore as separator is ok: Replace &quot; &quot; with _.
-1 byte if correct rounding is ok: Replace ($y*10|0)/10 with round($y,1).
-17 bytes for PHP 7.1: Replace substr($x,strlen($x)-1) with $x[-1].

80 (63) bytes for expanding one argument only:
&lt;?=number_format(($x=$argv[1])*[K=&gt;1e3,M=&gt;1e6,B=&gt;1e9][substr($x,strlen($x)-1)]);

save to file, then execute (or replace &lt;?= with echo +space and run with -r.